传送门

官方题解:http://acdream.info/topic?tid=4246

参考:https://www.cnblogs.com/nowandforever/p/4492428.html

题意:在给定的n个数中,能否找到几个数使得这几个和等于H;

思路:注意这道题的条件 0<n<=40, 0<=H<10^9, 0<=a[i]<10^9,其中 H 和 A [i] 给的比较大,dp的空间开不下,而n比较小,只有40,所以可以把所给的数分成20、20两部分,用dfs或者直接状态压缩从0至2^(n/2)循环来搞出每组所有可能的和(dfs+剪枝应该比循环快),然后再在第二部分找(H-第一部分的可能和)就可以了。卡了一下map和set。可以用hash或者二分来找

ac代码(600+ms):

#include <cstdio>
#include <algorithm>
using namespace std; const int maxn = ; //比2的20次大一点 int n,h,a[],d[],c[maxn],cnt,flag; int check(int s)
{
int le=,ri=cnt;
while(le<=ri)
{
int mid=(le+ri)>>;
if(c[mid]==s)return ;
if(c[mid]>s)
ri = mid - ;
else le = mid + ;
}
return ;
} void dfs(int sum,int cur,int nn,int on)//利用on使得两次dfs放在了一起
{
if(flag)return;
if(cur==nn+)
{
if(on)
c[++cnt]=sum;
else flag = check(h-sum);
return;
}
for(int i=;i<;i++)
{
int t=sum+d[cur]*i;
if(t > h)return;
dfs(t,cur+,nn,on);
}
}
int main(){
//freopen("in","r",stdin);
while(~scanf("%d%d",&n,&h))
{
for(int i = ; i <= n; i++)
{
scanf("%d",&a[i]);
}
cnt = flag = ;
int n1 = (n>>), n2=n-n1;//(n>>1)没加括号WA了几次
for(int i=; i<=n1; i++)
{
d[i]=a[i];
}
dfs(,,n1,); //第一次先算出前一半的所有可能和;
sort(c+,c+cnt+);
for(int i=n1+;i<=n;i++)
{
d[i-n1]=a[i];
}
dfs(,,n2,); //第二次求后一半的和 ,在用二分在前一半中找有没有对应的值
if(flag)puts("Yes");
else puts("No");
} return ;
}

我一开始注意到n比较小,就直接dfs暴力,但是超时了;

不过,我又看到有人没有用二分,只用了dfs+前缀和,0ms;

自己写的(12+ms)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = ;
int h,a[maxn],sum[maxn],n,ans=;
void dfs(int cur,int s)
{
if(ans)return;
if(s>sum[cur])return;
if(sum[cur]==s||s==){ans=;return;} for(int i=n;i>=;i--)
{
if(ans)return;
if(a[i]<=s)
{
dfs(i-,s-a[i]);
}
}
}
int main(){
// freopen("in","r",stdin);
while(~scanf("%d%d",&n,&h))
{
sum[]=;
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);
}
sort(a+,a++n); //不sort一直超时
for(int i=;i<=n;i++)
{
sum[i]=sum[i-]+a[i];
}
ans=;
dfs(n,h);
if(ans)puts("Yes");
else puts("No");
} return ;
}

ACdream1726-A Math game+(DFS+二分)+(DFS+前缀和)的更多相关文章

  1. Codeforces Round #381 (Div. 2)D. Alyona and a tree(树+二分+dfs)

    D. Alyona and a tree Problem Description: Alyona has a tree with n vertices. The root of the tree is ...

  2. uva 10004 Bicoloring(dfs二分染色,和hdu 4751代码差不多)

    Description In the ``Four Color Map Theorem" was proven with the assistance of a computer. This ...

  3. Java实现 LeetCode 655 输出二叉树(DFS+二分)

    655. 输出二叉树 在一个 m*n 的二维字符串数组中输出二叉树,并遵守以下规则: 行数 m 应当等于给定二叉树的高度. 列数 n 应当总是奇数. 根节点的值(以字符串格式给出)应当放在可放置的第一 ...

  4. [BZOJ 1082] [SCOI2005] 栅栏 【二分 + DFS验证(有效剪枝)】

    题目链接:BZOJ - 1082 题目分析 二分 + DFS验证. 二分到一个 mid ,验证能否选 mid 个根木棍,显然要选最小的 mid 根. 使用 DFS 验证,因为贪心地想一下,要尽量先用提 ...

  5. Codeforces Round #299 (Div. 2)A B C 水 dfs 二分

    A. Tavas and Nafas time limit per test 1 second memory limit per test 256 megabytes input standard i ...

  6. 51nod1307(暴力树剖/二分&dfs/并查集)

    题目链接: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1307 题意: 中文题诶~ 思路: 解法1:暴力树剖 用一个数 ...

  7. Chapter2二分与前缀和

    Chapter 2 二分与前缀和 +++ 二分 套路 如果更新方式写的是R = mid, 则不用做任何处理,如果更新方式写的是L = mid,则需要在计算mid是加上1. 1.数的范围 789 #in ...

  8. ACdream 1726 A Math game (dfs+二分)

    http://acdream.info/problem?pid=1726 官方题解:http://acdream.info/topic?tid=4246 求n个数里面能不能选一些数出来让它们的和等于k ...

  9. 【BZOJ】1146: [CTSC2008]网络管理Network(树链剖分+线段树套平衡树+二分 / dfs序+树状数组+主席树)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1146 第一种做法(时间太感人): 第二种做法(rank5,好开心) ================ ...

随机推荐

  1. .net持续集成sonarqube篇之 sonarqube与jenkins集成(插件模式)

    系列目录 Jenkins通过插件集成Sonarqube 通过上一节我们了解了如何配置以使jenkins ci环境中可以执行sonarqube构建,其实Sonarqube官方也提供了jenkins插件以 ...

  2. 【Python-Django后端开发】配置静态文件详解!!!

    配置前端静态文件 1. 准备静态文件 2. 指定静态文件加载路径 STATIC_URL = '/static/' # 配置静态文件加载路径 STATICFILES_DIRS = [os.path.jo ...

  3. 解决微信小程序开发者工具输入框焦点问题

    Windows10笔记本上运行微信小程序开发者工具,输入框(input,textarea)没有焦点,只能在真机调试,效率太低.后来发现是Window10对笔记本高分屏支持不好,要DPI缩放,导致兼容性 ...

  4. strus 上传文件

    (1) action代码 package comSys.struts.articleManager; import java.io.File; import java.io.FileInputStre ...

  5. sift、surf、orb 特征提取及最优特征点匹配

    目录 sift sift特征简介 sift特征提取步骤 surf surf特征简介 surf特征提取步骤 orb orb特征简介 orb特征提取算法 代码实现 特征提取 特征匹配 附录 sift si ...

  6. S2:java集合框架

    Java集合就是一个容器.面向对象语言对事物的体现都是以对象的形式存在,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式.集合只用于存储对象,集合长度是可变的,集合可以 ...

  7. jQuery插件之路(一)——试着给jQuery的一个Carousel插件添加新的功能

    前几日在网上看到了一个关于Carousel插件的教学视频,于是也顺便跟着学习着做了一下.但是在做完之后发现,在别的网站上面看到类似的效果要比现在做的这个要多一个功能,也就是在底下会有一些按钮,当鼠标放 ...

  8. JS和C#.NET获取客户端IP

    我们经常在项目中会遇到这种需要获取客户端真实IP的需求,其实在网上也能随便就能查到各种获取的方法,我也是在网上查了加上了自己的实践,说一下自己在实践后的感受,基本上网上大部分都是用JS的方法来获取客户 ...

  9. java随笔之接口

    /* * 接口大致上可以分为:哑接口,抽象接口,接口类 * 哑接口:就是public,protected(注意protect有包权限,只有本包才开放接口)方法 * 抽象接口:就是哑接口变为抽象方法,在 ...

  10. alluxio2.0特性-预览

    项目地址 https://github.com/Alluxio/alluxio/tree/branch-2.0-preview 2.0版本-构思和设计 支持超大规模数据工作负载 Alluxio作为计算 ...