回溯法-求解部分和問題
阿新 • • 發佈:2019-04-05
數組a ron 判斷 efi 求解 sig 2個 lse 回溯
題目內容:
給出N個正整數組成的數組A,求能否從中選出若幹個,使他們的和為K。如果可以,輸出:"YES",否則輸出"NO"。
輸入格式:
第1行:2個數N、K, N為數組的長度, K為需要判斷的和(2 ≤N ≤ 20,1 ≤ K ≤ 10^9)
第2 到第 N + 1行:每行1個數,對應數組的元素A[i] (1 ≤ A[i]≤ 10^6)
輸出格式:
如果可以,輸出:"YES",否則輸出"NO"。
樣例輸入
4 13
1
2
4
7
樣例輸出
YES
輸入樣例:
5 9
1
2
3
4
5
輸出樣例:
YES
題目分析:
本題與最小機器重量題類似,用while循環實現遍歷2^n種情況。
代碼如下
1 #include<stdio.h> 2 #define LEN 30 3 int main() 4 { 5 int a[LEN]; 6 int b[LEN][LEN];//b[i][0]代表第i個數不取,b[i][1]代表第i個數被取 7 int p[LEN]; 8 int n,k; 9 scanf("%d%d",&n,&k); 10 for(inti=1;i<=n;i++) 11 { 12 scanf("%d",&a[i]); 13 b[i][1]=a[i]; 14 b[i][0]=0; 15 } 16 int sum=0; 17 int t=1; 18 int q=0; 19 int sign=0; 20 while(t>0) 21 { 22 sum+=b[t][q]; 23 if(sum==k) 24 { 25 sign=1; 26 break; 27 } 28 p[t]=q; 29 if(t==n) 30 { 31 if(q<1) 32 { 33 q++; 34 } 35 else 36 { 37 sum-=b[t][q]; 38 while(p[t]>=1) 39 { 40 t--; 41 if(t<=0) 42 break; 43 sum-=b[t][p[t]]; 44 if(sum==k) 45 { 46 sign=1; 47 break; 48 } 49 50 } 51 q=p[t]+1; 52 } 53 } 54 else 55 { 56 t++; 57 q=0; 58 } 59 } 60 if(sign) 61 printf("YES"); 62 else 63 printf("NO"); 64 65 return 0; 66 }
回溯法-求解部分和問題