7-6 子集和问题 (12 分)
题目
给定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
基本思路
简单的回溯问题,代码也比较模板化,不难。
代码
#include <bits/stdc++.h>
using namespace std;
int n,res;
vector<int> v,v1;
void dfs(int sum,int pos){
if(pos>n) return;
sum += v[pos];
if(sum>res){
return;
}
v1.push_back(v[pos]);
if(sum==res){
for(auto it=v1.begin();it!=v1.end();it++){
cout<<*it<<" ";
}
cout<<endl;
v1.pop_back();
return;
}
for (int i = pos + 1; i <= n;i++){
dfs(sum, i);
}
v1.pop_back();
}
int main(){
cin>>n>>res;
v.resize(n+1);
for(int i=1;i<=n;i++) cin>>v[i];
for(int i=1;i<=n;i++)
dfs(0, i);//从临时和0,数组下标i开始dfs
}