可以用递归法,也可以用二进制对比法
递归法可以想象成二叉树,可选择的状态选项只有2个,有这个元素和没有这个元素,先一条道走到头,然后回溯一步,再走到头...也就是回溯法。
递归法代码如下:
void GetsubSet(int set[],bool have[],int length,int deepth = 0) { if(length == deepth) { cout << "{"; for(int i = 0; i < length; i++) { if(have[i]) cout << set[i] << ","; //如果有这个元素,则输出 } cout <<"}"<<endl; } else { have[deepth] = false; //分别列出两种状态分别深入递归 GetsubSet(set, have, length,deepth + 1); have[deepth] = true; GetsubSet(set, have, length,deepth + 1); } }
二进制法代码如下:
void GetsubSetB(int set[],int length) { long n = pow((float)2,length); for(int i = 0; i < n; i++) { cout << "{" ; int temp = i; for(int j = 0; j < length; j++) { if(temp & 1) cout << set[j] << ","; temp = temp >> 1; } cout << "}" << endl; } }