1. 程式人生 > >部分和問題 南陽acm1058(遞歸+dfs)

部分和問題 南陽acm1058(遞歸+dfs)

簡單的 arc pre 搜索 部分 highlight 簡單 use can

部分和問題

時間限制: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
來源
經典題目
上傳者
TC_楊闖亮
簡單的搜索問題,要註意它有多組測試數據
 1 #include<stdio.h>
 2 #include<string
.h> 3 int a[22],b[22]; 4 int n,k,flag; 5 void dfs(int x,int sum) 6 { 7 int i; 8 if(sum > k) return; //此時不需要再相加了,已經超了 9 if(x==n) 10 { 11 if(sum == k) 12 { 13 flag = 1; 14 printf("YES\n"); 15 for(i=0; i<n; i++) 16 {
17 if(b[i]) printf("%d ",a[i]); 18 } 19 printf("\n"); 20 return; 21 } 22 return; 23 } 24 b[x] = 0; 25 dfs(x+1,sum); //sum不需要+a[x]時,b[x] = 0 26 b[x] = 1; 27 dfs(x+1,sum+a[x]); //sum+a[x]時,b[x] = 1 28 } 29 int main()
30 { 31 int i; 32 while(scanf("%d%d",&n,&k)!=EOF) 33 { 34 flag = 0; 35 memset(b,0,sizeof(b)); 36 for(i=0; i<n; i++) 37 scanf("%d",&a[i]); 38 dfs(0,0); 39 if(!flag) 40 printf("NO\n"); 41 } 42 return 0; 43 }

部分和問題 南陽acm1058(遞歸+dfs)