子集和问题-dfs回溯法
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxv=1e5+5;
int n=0,res=0;
int a[maxv];
int b[maxv];
int vis[maxv];
int flag=0;
void dfs(int index,int sum,int tmp){
if(sum==res){
flag=1;
for(int i=0;i<tmp;i++){
cout<<b[i];
if(i!=tmp-1) cout<<" ";
}
cout<<endl;
return; //注意
}
if(index >= n) return ;
if(sum > res) return;
if(a[index] <= res ){
b[tmp]=a[index];
dfs(index+1,sum+a[index],tmp+1);
}
dfs(index+1,sum,tmp);
}
int main(){
cin>>n>>res;
memset(vis,0,sizeof(vis));
memset(b,0,sizeof(b));
for(int i=0;i<n;i++){
cin>>a[i];
}
dfs(0,0,0);
if(!flag){
cout<<"Solution!";
}
return 0;
}