子集生成

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);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值