有人说会用递归的都是大神,这就是一个关于递归的问题,原题如下:
给定整数a1,a2,.....an,判定是否可以从中选出若干数,使它们的和恰好为k。
限制条件:
1=<n<=20
-10^8=<ai<=10^8
-10^8=<k<=10^8
例如:输入n=4,a={1,2,4,7}, k= 13
输出:Yes(13=2+4+7)
具体代码如下:
#include <iostream>
using namespace std;
#define MAX_N 100
int n, k, a[MAX_N];
bool dfs(int i, int sum){
if (i == n)
return sum == k;
if (dfs(i + 1, sum))
return true;
if (dfs(i + 1, sum + a[i])){
return true;
}
return false;
}
int _tmain(int argc, _TCHAR* argv[])
{
cout << "请输入个数n,要求的和k,以及n个正整数\n";
cin >> n >> k;
for (int i = 1; i <= n; i++){
cin >> a[i];
}
if (dfs(0, 0)){
cout << "Yes\n";
}
else{
cout << "No\n";
}
return 0;
}
本题的结题关键在于对递归的理解和深度优先搜索。