【发布时间】:2015-05-15 06:41:11
【问题描述】:
我正在尝试编写一个 C 程序来查找给定数组和指定长度的所有组合。这就是我到目前为止所做的......
#include <stdio.h>
void com(int* a, int* t, int len, int i) {
int j, k;
if(len == 0) {
for(k=0;k<3;k++) {
printf("%d ",t[k]);
}
printf("\n");
return;
}
for(j = i ; j <= 4-len ; j++) { // 4 = original array size
t[3-len] = a[j];
com(a,t,len-1,i+1);
}
}
main() {
int t[3];
com((int[]){4,1,3,2},&t[0],3,0); // 3 = combination length
}
此代码中的问题是它没有选项可以跳过重复项、重复组合。例如对于它生成的数组 {1,2,3,4}
1 2 3
1 2 4
1 3 3
1 3 4
2 2 3
2 2 4
2 3 3
2 3 4
但它应该生成
1 2 3
1 2 4
1 3 4
2 3 4
我能做些什么呢?我不知道该怎么做。任何形式的帮助将不胜感激。谢谢。
另外,如果有比这更好的替代解决方案,请随时分享。
【问题讨论】:
-
结果(实际的或想要的)都不是 5 个数字中长度为 3 的 所有 组合。您可能应该首先尝试在纸上的不同算法,直到找到满足您要求的算法,然后尝试使用该算法编写程序。
-
您在寻找原始集合的所有 3 元素子集吗?
-
是的,类似@martin
-
结果集中的数字需要按升序顺序排列吗?你真的应该用这样的所有要求更新你的问题。
-
我不想发布仅链接的答案,但 Rosetta 代码有很多用于此类算法的代码。我想这就是你要找的东西:rosettacode.org/wiki/Combinations#C
标签: c combinations