1.增量构造法
看下面的代码(书中代码),只用记住一句话: 一次选出一个元素放到集合中
</pre><pre name="code" class="cpp">#include<iostream>
using namespace std;
int A[10] ;
void print_subset(int n,int *A,int cur);
int main(){
print_subset(10,A,0);
}
void print_subset(int n,int *A,int cur){
for (int i=0; i<cur; i++){
printf("%d",A[i]);
}
cout << endl;
int s;
if(cur>0){
s = A[cur-1] + 1;
}else{
s = 0;
}
for (int i=s; i<n; i++){ //仔细的理解这句话的含义:对于1234的组合
//我们常规写的时候是:1,2,3,1 2,1 3 ,1 4,……参照这个理解这个程序,感觉这个程序挺经典的
A[cur] = i;
print_subset(n,A,cur+1);
}
}
2位向量法:
#include<iostream>
using namespace std;
void print_subset(int n,int *B,int cur);
int B[10];
int main(){
print_subset(10, B, 0);
}
void print_subset(int n,int *B,int cur){
if (cur == n){
for (int i=0; i<cur; i++){
if(B[i])
cout <<i;
}
cout << endl;
return;
}
//其实我们说1,2,3,4,5的子集的个数有2^5个,是因为我们是站在每一位考虑,该位可能出现
//也可能不出现,所以每位的可能性是2,所以2*2*2*2*2 = 2^5下面利用向量构造的时候就是这个思想的体现
B[cur] = 1;//当该位出现的时候
print_subset(n, B, cur+1);
B[cur] = 0; //当该位不出现的时候
print_subset(n, B, cur+1);
}