部分和问题
题目描述:
给定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 }