给定整数a1,a2,…,an,判断是否可以从中选出若干数,使他们的和恰好为k。
限制条件
1 <=n <=20
1e-8 <= ai <= 1e+8
1e-8 <= k <= 1e+8
#include<cstdio>
#include<stack>
using namespace std;
stack<int> s;//声明存储int类型数据的栈
const int MAX_N=21;
int a[MAX_N];
int n,k;
bool dfs(int i,int sum){
if(i==n) return sum==k;
else if(sum>k) return false;
if(dfs(i+1,sum)) return true;
if(dfs(i+1,sum+a[i])){
s.push(a[i]);
return true;
}
return false;
}
int main(){
while(~scanf("%d%d",&n,&k)){
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
if(dfs(0,0)){
printf("YES ");
while(!s.empty()){
printf("%d ",s.top());
s.pop();
}
printf("\n");
}else{
printf("NO\n");
}
}
return 0;
}