1. 题目描述
N个正整数,每个数最多只能选一次,是否可以从中选出几个数,使他们的和为Target ?
例如:
N = 4, Target = 9
1 2 4 5
存在4+5=9
保证最多只有一种和为Target的选法
即在上例中不会有如:3 6 4 5 的数据出现
1.1 输入
输入第一行两个正整数N和Target(1 ≤ N ≤ 20)
第二行N个正整数,每个数不超过1000
1.2 输出
如果存在输出YES,并在第二行按输入顺序输出组成Target的元素
不存在输出NO
样例输入:
4 9
1 2 4 5
样例输出:
YES
4 5
解析:
这是一道dfs的入门级题目。 奈何本人太菜,无奈过来做笔记,蒟蒻暴风哭泣
此题中求和为target,可能为多个数相加,但只有一种情况。直接暴力求解。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 25;
int a[maxn],vis[maxn],tar,sum,n,flag;
vector<int> v;
void print(){ //倒着输出ans
for(int i=v.size()-1;i>=0;i--)
cout<<v[i]<<" ";
}
int dfs(int step,int sum){
if(sum == tar) //判断
return 1;
if(sum > tar ){ //判断
return 0;
}
if(step > n) //如果没有这个判断会走不出函数
return 0;
if(dfs(step+1,a[step] + sum)){ //取这一个数加上
v.push_back(a[step]); //放入向量
return 1;
}
if(dfs(step+1,sum)){ //不取这一个数
return 1;
}
return 0;
}
int main(){
cin>>n>>tar;
for(int i=0;i< n;i++){
cin>>a[i];
}
if(dfs(0,0)){
cout<<"YES"<<endl;
print();
}
else{
cout<<"NO";
}
return 0;
}
end.