cout<<t[i].s<<" ";
cout<<endl;
for(int i=0;i<5;i)
cout<<t[i].e<<" ";
return 0;
}
贪心算法,只考虑当前状态,让它成为最优
#include <iostream>
using namespace std;
int a[20];
/*递归输出n以内所有的子集,其中cur为当前下标,初始0*/
void print_subset(int n,int* a,int cur){
for(int i=0;i<cur;i)//每次递归输出当前子集,靠它来最后输出上一层指定的子集
cout<<a[i]<<' ';
cout<<endl;//以行分隔
//找到当前子集首个,因为按字典顺序输出,所以每次找到最小的元素,cur>0则minElem=a[cur-1]1,否则为0
intminElem = cur?a[cur-1]1:0;
//从子集第一个开始遍历,先不看下面的print_subset(n,a,cur1);但看这for循环,
//可知是将子集第一个从头往后依次赋为minElem-n-1.每次第一个变化后递归设置下一个(相当于下一层的第一个)
for(int i=minElem;i<n;i){
a[cur]=i;//当前层子集第一个
//cur1表示当前层设置完毕,开始递归下一层,和前面步骤一样。
//到达最后一层结束后return 到上一层,然后i,a[cur]的(首元素)改变,又反复递归下一层...
print_subset(n,a,cur1);
}
}
int main(){
intn ;
while(cin>>n,n){
print_subset(n,a,0);
}
}
#include <iostream>
using namespace std;
bool b[20]={0};//判断当前每一个节点选中状态
/*递归输出n以内所有的子集,其中b表示该节点是否选中,cur为当前下标,初始0*/
void print_subset(int n,bool* b,int cur){
//当cur加到n的时候输出该串节点(解答树)的
if(cur==n){
for (int i=0;i<n;i){
if(b[i])
cout<<i<<' ';
}
cout<<endl;
return ;
}
b[cur]=true;//该节点设为选中状态
print_subset(n,b,cur1);//cur1递归该状态时的下一层节点,循环该操作
b[cur]=false;//该节点设为不选中状态
print_subset(n,b,cur1);//cur1递归该状态时的下一层节点,循环该操作
}
int main(){
intn ;
while(cin>>n,n){
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-34960-5.html
美妞