NYOJ-1058-部分和問題

部分和問題
時間限制: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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章