部分和問題
時間限制:1000 ms | 內存限制:65535 KB
難度:2
描述
給定整數a1、a2、…….an,判斷是否可以從中選出若干數,使它們的和恰好爲K。
輸入
首先,n和k,n表示數的個數,k表示數的和。
接着一行n個數。
(1<=n<=20,保證不超int範圍)
輸出
如果和恰好可以爲k,輸出“YES”,並按輸入順序依次輸出是由哪幾個數的和組成,否則“NO”
樣例輸入
4 13
1 2 4 7
樣例輸出
YES
2 4 7
#include<cstdio>
#include<stack>
using namespace std;
stack<int> v;
const int maxn = 22;
int a[maxn];
int n , k ;
bool dfs(int i , int sum){
if(i == n) return sum == k;
if(sum > k) return false ;
if(dfs(i+1 , sum)) return true ;
if(dfs(i+1 , sum+a[i]) ){
v.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\n");
while(!v.empty()){
printf("%d" , v.top());
v.pop();
}
}
else
printf("NO");
}
return 0;
}