组合,不重复N个元素,无需使用..to..do

组合,不重复N个元素,无需使用..to..do,第1张

组合,不重复N个元素,无需使用..to..do

看来您正在寻找一种快速算法来计算所有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}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5564848.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-14
下一篇 2022-12-14

发表评论

登录后才能评论

评论列表(0条)

保存