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;
}
 
时间: 2024-10-26 18:19:25

ACdream 1726 A Math game的相关文章

acdream 1726 A Math game (部分和问题 DFS剪枝)

A Math game Time Limit: 2000/1000MS (Java/Others) Memory Limit: 256000/128000KB (Java/Others) Problem Description Recently, Losanto find an interesting Math game. The rule is simple: Tell you a numberH, and you can choose some numbers from a set {a[1

ACDREAM 1726 A Math game(折半枚举+hash)

题目链接: http://acdream.info/problem?pid=1726 题意: 给定n 个数,和一个数看,判断k能否由其中的任意个数的和组成. 分析: 因为n最大为40,暴力枚举所有的情况 复杂度为 2^40 肯定TLE ,然后就想到了折半枚举 分成两半,先处理前n/2个数的组合的情况 ,把所得结果哈希一下,然后再枚举后一半 的所有情况,然后在哈希表里查找.时间复杂度为 O(2^(N/2)); 代码如下: #include <stdio.h> #include <iostr

ACdream 1726 A Math game (dfs+二分)

http://acdream.info/problem?pid=1726 官方题解:http://acdream.info/topic?tid=4246 求n个数里面能不能选一些数出来让它们的和等于k. 因为k很大,不能用背包,但是n很小,最大为40,所以拆成了2部分,之后最大为2^20次方<1050000;每次枚举前一半的和,然后用数组存储,然后得到一个总和减去后一半的差用二分查找. 1 #include<cstdio> 2 #include<cstring> 3 #inc

ACDream 1726 A Math game (折半查找)

A Math game Time Limit: 2000/1000MS (Java/Others) Memory Limit: 256000/128000KB (Java/Others) Submit Statistic Next Problem Problem Description Recently, Losanto find an interesting Math game. The rule is simple: Tell you a number H, and you can choo

ACdreamOJ 1726 hash

http://acdream.info/problem?pid=1726 Problem Description Recently, Losanto find an interesting Math game. The rule is simple: Tell you a number H, and you can choose some numbers from a set {a[1],a[2],......,a[n]}.If the sum of the number you choose

ACdream 1203 - KIDx&#39;s Triangle(解题报告)

KIDx's Triangle Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) Submit Statistic Next Problem Problem Description One day, KIDx solved a math problem for middle students in seconds! And than he created this problem. N

ACdream 1198 Transformers&#39; Mission(最短路)

题目地址:http://acdream.info/problem?pid=1198 比赛的时候做出的人很少...所以我也没看....其实就是一道简单的最短路...要使时间最短,那么对于每一个点来说都要最短的时间从起点走到该点,然后再用最短的时间从该点到终点,那么只要求两次最短路就行了.然后最后求两个最短路的和的最大值,即最晚到达的时间. 代码如下: #include <iostream> #include <cstdio> #include <string> #incl

ACdream 1101 瑶瑶想要玩滑梯

没想到线段树的基本用法这么长时间没写了还没有忘,1A的感觉还是很爽的. 题目大意: 中文题,点此查看题目. 解题思路: 线段树的区间更新与查询. lazy标记的使用. 当需要返回区间多个值时可以使用引用参数. 下面是代码: #include <stdio.h> #include <string.h> #include <algorithm> #include <iostream> #include <math.h> #include <st

ACdream 1216 (ASC训练1) Beautiful People(DP)

题目地址:http://acdream.info/problem?pid=1216 这题一开始用的是线段树,后来发现查询的时候还需要DP处理,挺麻烦..也就不了了之了..后来想到,这题其实就是一个二维的最长上升子序列.. 要先排序,先按左边的数为第一关键字进行升序排序,再按右边的数为第二关键字进行降序排序.这样的话,第一关键字相同的的肯定不在一个同一个上升子序列中.然后只对第二关键字进行复杂度为O(n*logn)的DP,找出最长上升序列,然后处理前驱,并输出即可. 代码如下: #include