ACdream 1726 A Math game

深搜。不过有一个强大的剪枝。就是假设之后的全部用上都不能达到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;
}

 

 
posted @ 2015-07-12 08:03  Fighting_Heart  阅读(164)  评论(0编辑  收藏  举报