A Math game
Problem Description
Input
In each case, there are two numbers in the first line n (the size of the set) and H. The second line has n numbers {a[1],a[2],......,a[n]}. 0<n<=40, 0<=H<10^9, 0<=a[i]<10^9,All the numbers are integers.
Output
Sample Input
10 87 2 3 4 5 7 9 10 11 12 13 10 38 2 3 4 5 7 9 10 11 12 13
Sample Output
No Yes
简单的dfs,从大到小dfs即可。
AC代码:
#include "iostream"
#include "cstdio"
#include "cstring"
#include "algorithm"
#include "queue"
using namespace std;
const int MAXN = 45;
int n, h, a[MAXN], sum[MAXN];
bool flag;
void dfs(int n, int s)
{
if(flag) return;
if(s > sum[n]) return;
if(sum[n] == s || s == 0) {
flag = true;
return;
}
for(int i = n; i >= 1; --i)
if(s >= a[i]) dfs(i - 1, s - a[i]);
}
int main(int argc, char const *argv[])
{
while(scanf("%d%d", &n, &h) != EOF) {
memset(sum, 0, sizeof(sum));
flag = false;
for(int i = 1; i <= n; ++i) {
scanf("%d", &a[i]);
sum[i] = sum[i - 1] + a[i];
}
dfs(n, h);
if(flag) printf("Yes\n");
else printf("No\n");
}
return 0;
}
1万+



被折叠的 条评论
为什么被折叠?



