A Math game
Memory Limit: 256000/128000KB (Java/Others)
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 areintegers.
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
Source
题目链接: http://acdream.info/problem?pid=1726
题目大意:部分和问题
题目分析:正解是二分+DFS,我的做法是DFS用前缀和剪枝,4ms过,估计还是数据水了,
#include <cstdio>
#include <cstring>
#define ll long long
ll a[45], h, sum[45];
int n;
bool flag;
void DFS(ll num, int pos)
{
if(num == h)
{
flag = true;
return;
}
if(flag || pos == n + 1)
return;
//若当前数字加剩下的数字和小于h或者当前数字大于h则返回
//不加妥T
if(sum[n] - sum[pos - 1] + num < h || num > h)
return;
DFS(num + a[pos], pos + 1);
DFS(num, pos + 1);
return;
}
int main()
{
while(scanf("%d %lld", &n, &h) != EOF)
{
memset(sum, 0, sizeof(sum));
flag = false;
for(int i = 1; i <= n; i++)
{
scanf("%lld", &a[i]);
sum[i] = sum[i - 1] + a[i];
}
DFS(0, 1);
if(flag)
printf("Yes\n");
else
printf("No\n");
}
}
275



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



