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;

}

 

 

你可能感兴趣的:(Math)