题目大意:
给出N个正整数组成的数组A,求能否从中选出若干个,使他们的和为K。如果可以,输出:"Yes",否则输出"No"。
Input
第1行:2个数N, K, N为数组的长度, K为需要判断的和(2 <= N <= 20,1 <= K <= 10^9) 第2 - N + 1行:每行1个数,对应数组的元素A[i] (1 <= A[i] <= 10^6)
Output
如果可以,输出:"Yes",否则输出"No"。
Input示例
5 13 2 4 6 8 10
Output示例
No
思路:直接DFS,判断该当前数选不选即可。
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <cmath>
#include <stack>
#include <queue>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
#include <stdlib.h>
#include <iomanip>
using namespace std;
#define maxn 104
#define mem(a , b) memset(a , b , sizeof(a))
#define MOD 1e9+7
int a[maxn] , flag;
int n , k;
void DFS(int pos , int sum)
{
if(pos >= n) return ;
if(sum == a[pos] )
{
flag = 1;
return ;
}
if(sum >= a[pos] ) DFS(pos + 1 , sum - a[pos]);
DFS(pos + 1 , sum);
}
int main()
{
while(scanf("%d %d" , &n , &k) != EOF)
{
for(int i = 0 ; i < n ; i ++)
{
scanf("%d" , &a[i]);
}
flag = 0;
DFS(0 , k);
if(flag) printf("Yes\n");
else printf("No\n");
}
return 0;
}