首先我们来看看这样一道题目:
给定整数a1,a2,a3,...,an,判断是否可以从中选出若干数,使它们的和恰好为k。
1<=n<=20
-10^8<=ai<=10^8
-10^8<=k<=10^8
输入
4
1 2 4 7
13
4
1 2 4 7
15
输出
Yes
No
问题分析
我们可以在每个值选择加或者不加,然后再全部n个数都决定后再在判断它们的和是否为k即可。
代码
#include <bits/stdc++.h>
using namespace std;
#define fr(i, r, n) for(int i = r; i < n; ++i)
const int maxn = (int)1e6 +10;
typedef long long ll;
int arr[30];
int n, k;
bool dfs(int i, int sum)
{
if(i == n) return sum == k;//如果前n项都计算过了就返回sum是否和k相等
if(dfs(i+1, sum)) return true;//不加arr[i]的情况
if(dfs(i+1, sum+arr[i])) return true;//加arr[i]的情况
return false;
}
int main()
{
while(cin>>n)
{
fr(i, 0, n)
cin>>arr[i];
cin>>k;
if(dfs(0, 0)) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
return 0;
}