【发布时间】:2014-12-12 19:20:20
【问题描述】:
我有一个包含 n 个整数的数组,我需要打印每个唯一的子集。 例如,如果我的数组 {1,1,1,2},输出应该是
1,
1,1,
1,1,1,
2,
1,2,
1,1,2,
1,1,1,2,
我已经能够使用二进制移位打印所有可能的子集,但我一直在删除重复项。我试图将打印的子集保存到另一个数组并进行比较,但这会浪费大量内存。
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
int main ( int argc, char * argv [] ) {
int numbers[4] = {1,1,1,2};
int n = 4;
int np = 1<<n;
int i;
int bitv;
int pos;
for (i=1; i<np; i++){
bitv = i;
pos = 0;
while (bitv > 0){
if ((bitv & 1) == 1) printf("%d,",numbers[pos]);
bitv >>= 1;
pos++;
}
printf ("\n");
}
return 0;
}
和输出:
1,
1,
1,1,
1,
1,1,
1,1,
1,1,1,
2,
1,2,
1,2,
1,1,2,
1,2,
1,1,2,
1,1,2,
1,1,1,2,
【问题讨论】:
-
您在尝试什么来删除重复项? “保存打印的子集”是什么意思?
-
您需要将您的答案集累积到某种类型的存储结构中。当你添加一个新的组合时,让加法器检查那个组合是否已经存在,如果是,就返回,否则就在你的新组合中。完成生成结果后,输出存储的内容。
-
可能最简单的方法是生成一个包含组合的字符串,然后您可以在存储中遍历您的存储结构以确保您还没有该字符串。
-
那些在技术上不是集合。列表将是一个更好的描述。您给定的列表是否已知已排序?如果是,您可以先查看长度为 1 的子列表,然后查看长度为 2 的子列表,依此类推。在这种情况下,检测重复项会很容易。
-
好吧,我想你是对的,我不是母语人士。我按降序对数组进行排序,然后开始打印所有可能的列表。