题目描述:
给定n个不同的正整数集合w=(w1,w2,…,wn)和一个正数W,要求找出w的子集s,使该子集中所有元素的和为W。
输入格式:
第一行输入n和W,第二行依次输入n个数。
输出格式:
每行输出一个符合要求的子集。
输入样例1:
4 31
11 13 24 7
输出样例1:
11 13 7
24 7
代码如下:
这题跟我前面写的这题差不多的:递归实现指数型枚举------DFS-优快云博客
#include <bits/stdc++.h>
using namespace std;
int n,w;
int st[10];//标志数组,0表示未确定。1表示选,2表示不选
int a[100];//存储结果集
int sum=0;//集合中所有元素和
void dfs(int k)
{
if(k>n)
{
if(sum==w)
{
for(int i=1;i<=n;i++)
if(st[i]==1)
cout<<a[i]<<" ";
cout<<endl;
}
return ;//要在这里return;
}
//先选
if(st[k]==0)
{
st[k]=1;
sum=sum+a[k];
k++;
dfs(k);
}
//回溯
k--;
sum=sum-a[k];
st[k]=0;
//不选
if(st[k]==0)
{
st[k]=2;
k++;
dfs(k);
}
//回溯
k--;
st[k]=0;
}
int main()
{
cin>>n>>w;
for(int i=1;i<=n;i++)
cin>>a[i];
dfs(1);
return 0;
}
希望能帮助到各位同志,谢谢!