Hallo, ich habe die Bewertungsfunktion nicht angeschaut.
Wenn du zum Beispiel zehn feste Punkte hast, an vier Punkten was reinhängen willst und aufgrund der fest vorgegebenen Punkte lediglich an allen (10 tief 4) möglichen Kombinationen sowie an einer besten Lösung interessiert bist, dann könntest du es so tun.
Delphi-Quellcode:
type TBewertungstyp = integer;
TBrett = record
wo : array[0..9] of byte; // hier speichern wir, wo wir was tun: 0=nix tun, 1=was tun
anz, pos : integer; // In function bewerte gehen wir brett zum beispiel von links=0 nach rechts=9 durch. pos: da befinden wir uns gerade. anz: so oft haben wir was getan (d.h. wo[i]=1 gesetzt)
end;
TRes = record
br : TBrett;
bew : TBewertungstyp;
end;
function meingebewertungsfunktion( brett : TBrett) : TRes;
var hres : TBewertungstyp;
begin
Result.br := brett;
Result.bew := ...; // hier musst du deine Bewertung abhängig von brett.wo einsetzen
end;
// hier werden alle (n tief k) Kombinationen aufgezählt und bewertet:
function bewerte( brett : TBrett ; n, k : integer ) : TRes;
var b0, b1 : TRes;
begin
inc(brett.pos);
if ( k-brett.anz > n-brett.pos ) then Result.bew := 0 // Abbruch, da wir noch k-brett.anz Mal was tun müssten, aber nur noch n-brett.pos Postionen frei sind
else
if brett.anz = k then // k Postionen sind besetzt => auswerten:
Result := meingebewertungsfunktion( brett ) // hier werden alle (n tief k) Kombinationen ausgewertet
else
begin
// Fall 1 - an brett.pos nix tun:
b0 := bewerte( brett, n, k );
// Fall 2 - an brett.pos was tun:
brett.wo[brett.pos] := 1;
inc(brett.anz);
b1 := bewerte( brett, n, k );
// hier wählst du die bessere variante aus
if b0.bew > b1.bew then Result := b0 else Result := b1;
end;
end;
Aufruf:
Delphi-Quellcode:
function loesung_str( loesung : TRes ):string;
var hs : string;
begin
hs := loesung.bew.ToString + ' : ';
for var i := 0 to length( loesung.br.wo )-1 do
hs := hs + loesung.br.wo[i].ToString;
Result := hs;
end;
function loesung( n, k : integer ) : TRes;
var meinbrett : TBrett;
begin
// Brett "initialisieren":
fillchar(meinbrett.wo[0], n, 0 );
meinbrett.pos := -1;
meinbrett.anz := 0;
// beste Kombination suchen:
Result := bewerte( meinbrett, n, k );
end;
procedure TForm29.Button1Click(Sender: TObject);
var best : TRes;
begin
best := loesung( 10, 4 );
showmessage( loesung_str( best ) );
end;