Description
给出一组整数,a1、a2、a3...、an,判断是否可以从中抽取若干数,使他们的和恰好为k;
限制条件:
1<= n <=20;-10^8<=ai<=10^8; -10^8 <= k <= 10^8;
Input
输入n,然后输入n 个数字,再输入k
Output
如果可以使和为k,则输出Yes,否则输出No;
Sample Input
n = 4
a = {1,2,4,7}
k = 13
Sample Output
Yes
代码:
/*
从a1开始,按顺序决定加与不加,在全部n个数都决定后在判断他们的和是不是k即可。
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#define Max 100000000
using namespace std;
int n,k;
int a[Max];
bool dfs(int i,int sum)
{
//如果前n项都加过了则返回sum是否与k 相等
if(i == n+1)
return sum == k;
//不加a[i]
if(dfs(i+1,sum))
return true;
//加a[i];
if(dfs(i+1,sum+a[i]))
return true;
return false;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
scanf("%d",&k);
if(dfs(1,0))
printf("Yes\n");
else
printf("No\n");
return 0;
}