看来您正在寻找一种快速算法来计算所有k个组合。以下Delphi代码是此处找到的C代码的直接翻译:生成组合。我什至修复了该代码中的错误!
program kCombinations;{$APPTYPE CONSOLE}// Prints out a combination like {1, 2}procedure printc(const comb: array of Integer; k: Integer);var i: Integer;begin Write('{'); for i := 0 to k-1 do begin Write(comb[i]+1); if i<k-1 then Write(','); end; Writeln('}');end;(*Generates the next combination of n elements as k after comb comb => the previous combination ( use (0, 1, 2, ..., k) for first) k => the size of the subsets to generate n => the size of the original set Returns: True if a valid combination was found, False otherwise*)function next_comb(var comb: array of Integer; k, n: Integer): Boolean;var i: Integer;begin i := k - 1; inc(comb[i]); while (i>0) and (comb[i]>=n-k+1+i) do begin dec(i); inc(comb[i]); end; if comb[0]>n-k then// Combination (n-k, n-k+1, ..., n) reached begin // No more combinations can be generated Result := False; exit; end; // comb now looks like (..., x, n, n, n, ..., n). // Turn it into (..., x, x + 1, x + 2, ...) for i := i+1 to k-1 do comb[i] := comb[i-1]+1; Result := True;end;procedure Main;const n = 4;// The size of the set; for {1, 2, 3, 4} it's 4 k = 2;// The size of the subsets; for {1, 2}, {1, 3}, ... it's 2var i: Integer; comb: array of Integer;begin SetLength(comb, k);// comb[i] is the index of the i-th element in the combination //Setup comb for the initial combination for i := 0 to k-1 do comb[i] := i; // Print the first combination printc(comb, k); // Generate and print all the other combinations while next_comb(comb, k, n) do printc(comb, k);end;begin Main; Readln;end.
输出量
{1,2}{1,3}{1,4}{2,3}{2,4}{3,4}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)