NYOJ 1058 部分和問題(簡單深搜)
阿新 • • 發佈:2019-02-10
部分和問題
時間限制: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<stdio.h> #include<string.h> int a[30],book[30]; int n,j,s,sum,f; void dfs(int step) { int i; if(s>=sum ) { if(s==sum) { if(f==0) { f=1; } if(f) { printf("YES\n"); for(i=0; i<n; i++) if(book[i]) printf("%d ",a[i]); printf("\n"); } } //return ; } int k; for(k=step; k<n; k++) { s+=a[k]; book[k]=1; dfs(k+1); s-=a[k]; book[k]=0; } } int main() { int i; while(~scanf("%d%d",&n,&sum)) { s=0,f=0; memset(book,0,sizeof(book)); for(i=0; i<n; i++) scanf("%d",&a[i]); dfs(0); if(f==0) printf("NO\n"); } return 0; }