【算法-递归-代码】部分和问题

给定整数a1,a2,...,an。判断是否可以从中选出若干数,使它们的和恰好为k。(来自挑战程序设计竞赛ch02p30)

 1 #include <iostream>
 2  
 3 bool dfs(int ,int ,int ,int,int[]);
 4 void solve(int,int,int[]);
 5 int main() {
 6     using namespace std;
 7  
 8     int num,sum=0;
 9     //输入输出
10     cin >> num;
11     int sta[num];
12     int b = 0;
13     for(int a = 0;a < num;a++){
14         cin >> b;
15         sta[a] = b;
16     }
17  
18     int k;
19     cin >> k;
20     //搜索
21     solve(num,k,sta);
22     return 0;
23 }
24 //已经从前i项得到了和sum,然后对于i项之后的进行分支
25 bool dfs(int i, int sum, int num, int k, int sta[]){
26  
27     //如果前n项都计算过了,则返回sum是否和k相等
28     if(i == num ) return sum == k;
29  
30     //不加上a[i]的情况
31     if(dfs(i+1,sum,num,k,sta)) return true;
32  
33     //加上a[i]的情况
34     if(dfs(i+1,sum+sta[i],num,k,sta) )return true;
35  
36     //无论加不加a[i]都不能凑成k就返回false
37     return false;
38 }
39 void solve(int num, int k,int sta[]) {
40     if (dfs(0, 0, num ,k,sta)) printf("Yes\n");
41     else printf("No\n");

 c与c++混着用。。。其实是书里用的是c而我只会c++。

输入例

4

1 2 4 7

13

输出

Yes

猜你喜欢

转载自www.cnblogs.com/VanitasNote/p/11229511.html