部分和问题

 

题目描述:

给定a1, a2,````` an, 判断是否可以选出若干数, 使他们的和恰好是k

1 <= n <= 20;

-1e8 <= ai ,k <= 1e8

 

代码:

 

 1 #include <iostream>
 2 #include <cstring>
 3 #include <algorithm>
 4 using namespace std;
 5 
 6 const int N = 1e8+10;
 7 int n;
 8 int k;
 9 int a[N];
10 // the mind: 如果当前深搜了共 n个数, 则输出判断  sum == k  和是否能凑成k
11 // 不够n个数时, 分两种情况: 
12 // 1. 不加a[i] 时  2. 加上a[i]时
13 
14 // 已经从前i项得到了和sum, 然后对于i项之后的进行分支
15 bool dfs(int i, int sum)
16 {
17     if(i == n) return sum == k;
18     
19     // 1. 不加a[i] 时
20     if(dfs(i+1, sum)) return true;
21     
22     //  2. 加上a[i]时
23     if(dfs(i+1, sum+ a[i])) return true;
24     
25     return false;
26 }
27 
28 int main()
29 {
30     cin >> n ;
31     for (int i = 0; i < n; i ++ ) cin >> a[i];
32     
33     printf("a is input ok\n");
34     
35     cin >> k;
36     
37     if (dfs(0,0)) printf("Yes\n");
38     else printf("No\n");
39     
40     
41     return 0;
42 }

 

posted @ 2021-04-17 15:34  Leo-aiolia-bao  阅读(72)  评论(0编辑  收藏  举报