真香系列之回溯框架
问题描述:设计一个回溯算法,来生成数字1,2,3……n的所有子集(空集除外)
输入数值n(0<n<11)
input:
3
output:
1
1 2
1 2 3
1 3
2
2 3
3
问题分析:做题之时灵光闪现,主要还是得益于回溯大法的框架(理解出走法,其实做出来也是简单的)
什么思路,还是一层一层向下走,遇到合适的就输出,走到最后一个数就回溯更新K的值(借助内层while的判断条件),感觉说思路还不如把代码放devc++里调试走一遍,一调就懂系列。弄懂了N皇后问题(回溯),这类问题就。。。
#include<iostream>
using namespace std;
bool check(int *a,int k){
for(int i=1;i<k;i++){
if(a[i]==a[k] || a[i]>a[k]){
return false;
}
}
return true;
}
void print(int *a,int k){
for(int i=1;i<=k;i++){
cout<<a[i]<<" ";
}
cout<<endl;
}
int main(){
int n;
int a[11]={0};
int k=1;
cin>>n;
while(k>0){
while(a[k]<n){
a[k]++;
if(check(a,k) && k<=n){
a[0]++;
print(a,k);
k++;
}
}
a[k]=0;
k--;
}
cout<<"N个数的子集共"<<a[0]+1<<"个"<<endl;
return 0;
}
2019.4.24
放数组里,方便任意输入集合元素
#include<iostream>
#include<cstring>
using namespace std;
int a[10]={1,2,3};
int rs[10]={0};
int c[10]={0};
bool check(int *a,int n){
for(int i=1;i<n;i++){
if(a[i]==a[n] || a[i]>a[n]){
return false ;
}
}
return true;
}
int print(int *a,int n){
for(int i=1;i<=n;i++){
cout<<a[i]<<" ";
}
cout<<endl;
}
int main(){
int k=1;
int n=3;
while(k>=1){
while(c[k]<n){
rs[k]=a[c[k]++];
if(check(rs,k) && k<=n){
print(rs,k);
k++;
}
}
rs[k]=0;
c[k]=0;
k--;
}
return 0;
}
2019.4.25