1. 程式人生 > >回溯法-求解部分和問題

回溯法-求解部分和問題

數組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(int
i=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 }

回溯法-求解部分和問題