首页 > 其他 > 详细

ACdream 1726 A Math game

时间:2015-07-12 08:23:40      阅读:241      评论:0      收藏:0      [点我收藏+]

深搜。不过有一个强大的剪枝。就是假设之后的全部用上都不能达到H,则return。

if (A[n]-A[x-1]+summ< H) return; //A[n]表示前nx项和

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

const int maxn = 50;
long long  a[maxn], A[maxn];
int flag, n;
long long H;

void DFS(long long summ, int x)
{
    if (summ == H) { flag = 1; return; }
    if (x > n) return;
    if (summ > H) return;
    if (A[n] - A[x - 1] + summ< H) return;
    DFS(summ + a[x], x + 1);
    if (flag == 1) return;
    DFS(summ, x + 1);
    if (flag == 1) return;
}
int main()
{
    int i;
    while (~scanf("%d%lld", &n, &H))
    {
        flag = 0;
        memset(A, 0, sizeof(A));
        for (i = 1; i <= n; i++)
        {
            scanf("%lld", &a[i]);
            A[i] = A[i - 1] + a[i];
        }
        DFS(0, 1);
        if (flag) printf("Yes\n");
        else printf("No\n");
    }
    return 0;
}

 

 

ACdream 1726 A Math game

原文:http://www.cnblogs.com/zufezzt/p/4640463.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!