Description
N个正整数,每个数最多只能选一次,是否可以从中选出几个数,使他们的和为Target ?
例如:
N = 4, Target = 9
1 2 4 5
存在4+5=9
保证最多只有一种和为Target的选法
即在上例中不会有如:3 6 4 5 的数据出现
Input
输入第一行两个正整数N和Target(1 ≤ N ≤ 20)
第二行N个正整数,每个数不超过1000
Output
如果存在输出YES,并在第二行按输入顺序输出组成Target的元素
不存在输出NO
Sample Input
4 9
1 2 4 5
Sample Output
YES
4 5
#include<iostream>
#include<vector>
using namespace std;
vector<int > ve;
int num[25],n,k,target,sum=0;
bool dfs(int z){ //dfs搜索
for(int i=z;i<=k;i++){
sum+=num[i];
if(sum==target){
ve.push_back(num[i]); //当和达到目标值时将该值保存到ve数组中后返回true
return true;}
if(sum<target){
ve.push_back(num[i]); //当和小于目标值后将该值保存到ve数组中在进行下一步搜索
if(dfs(i+1) )return true;//当返回真时即已经搜索到目标值所以也返回真
sum-=num[i]; //否则将改值从ve数组中拿出 并且数的和也要减去拿掉的值
ve.pop_back();
continue;
}
if(sum>target){
sum-=num[i];//当大于目标值时减去当前值并进行下一个数的判断
continue;
}
}
return false;
}
int main(){
cin>>n;
cin>>target;
k=0;
for(int i=1;i<=n;i++){
int s;
cin>>s;
if(s<=target)num[++k]=s; //这里只对小于目标值的数进行存储并用k记录个数
}
if(dfs(1)){
cout<<"YES"<<endl;
vector<int >::iterator it=ve.begin();
for(;it!=ve.end();it++)cout<<*it<<" ";
}else{
cout<<"NO"<<endl;
}
return 0;
}