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 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 is H, then you win. Losanto just want to know whether he can win the game.

Input

There are several cases.
In each case, there are two numbers in the first line n (the size of the set) and H. The second line has n numbers {a[1],a[2],......,a[n]}.0<n<=40, 0<=H<10^9, 0<=a[i]<10^9,All the numbers are integers.

Output

If Losanto could win the game, output "Yes" in a line. Else output "No" in a line.

Sample Input

  1. 10 87
  2. 2 3 4 5 7 9 10 11 12 13
  3. 10 38
  4. 2 3 4 5 7 9 10 11 12 13

Sample Output

  1. No
  2. Yes

Source

第九届北京化工大学程序设计竞赛

DFS:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int N=;
  4. int a[N],s[N], n, flag, h;
  5. void dfs(int sum, int now)//sum是当前累加和,now是当前累加了几个数
  6. {
  7. if(sum == h){
  8. flag = ; return ;
  9. }
  10. /*
  11. 1. flag==1 当前累加和为h,标记后直接退出
  12. 2. now == n + 1 不管能不能凑到h,累加的数次已经用完了
  13. 3. s[n] - s[now - 1] + sum < h 当前累加和+之前区间和也达不到h
  14. 4. sum > h 当还没到头当前累加和超过了h ,之后也只能超过 h,米有再搜索的必要了
  15. */
  16. if(flag || now == n + || s[n] - s[now - ] + sum < h || sum > h){
  17. return ;
  18. }
  19. dfs(sum+a[now],now+);//加当前这个数
  20. dfs(sum,now+);//不加当前的数
  21. }
  22. int main()
  23. {
  24. while(cin >> n >> h)
  25. {
  26. for(int i=; i<=n; i++){
  27. cin >> a[i];
  28. s[i] = s[i-] + a[i];
  29. }
  30. flag = ;
  31. dfs(,);
  32. puts(flag?"Yes":"No");
  33. }
  34. return ;
  35. }

折半查找:

  1. /*
  2. 给定n个数字,问能否使这些数字相加得到h?
  3. */
  4. /*
  5. 折半查找,先将前半部分的和算出来存在数组中,再将后半部分的数ans进行计算,然后在前半部分进行查找h-ans
  6. 这一题用到了一种新的写法,位运算。
  7. 用二进制来表示哪些数取了,哪些数没取。
  8. 比如,算前5个数字,2^5的二进制就是100000 那么可以把前面五个数的组合情况全部都表示出来
  9. 每一个二进制位表示第几个数,比如取第一和第三个数,那么二进制就是000101。
  10. */
  11. #include<bits/stdc++.h>
  12. using namespace std;
  13. const int N=;
  14. int a[N],sum[N];
  15. int main()
  16. {
  17. int n, h, s;
  18. while(cin >> n >> h)
  19. {
  20. for(int i=; i<n; i++)
  21. cin >> a[i];
  22. int k = , mid =( n >> );
  23. for(int i=; i<(<<mid); i++)
  24. {
  25. s = ;
  26. for(int j=; j<mid; j++)
  27. {
  28. if(i&(<<j)){
  29. s += a[j];
  30. }
  31. }
  32. if(s <= h) sum[k++] = s;//将前半部分的和算出来存在数组
  33. }
  34.  
  35. sort(sum, sum+k);
  36.  
  37. int res = n - mid;
  38. int f = ;
  39.  
  40. for(int i=; i<(<<res); i++)
  41. {
  42. s = ;
  43. for(int j=; j<res; j++)
  44. {
  45. if(i&(<<j)) s += a[mid + j]; //进行计算后半部分的数s
  46. }
  47. if(s > h) continue;
  48. if(sum[lower_bound(sum,sum+k,h-s)-sum] == h - s) //将后半部分的数s进行计算,然后在前半部分进行查找h-s
  49. {
  50. f = ;
  51. break;
  52. }
  53. }
  54. puts(f?"Yes":"No");
  55. }
  56. return ;
  57. }

给定n个数字,问能否使这些数字相加得到h【折半查找/DFS】的更多相关文章

  1. POJ1228:Grandpa's Estate(给定一些点,问是否可以确定一个凸包)

    Being the only living descendant of his grandfather, Kamran the Believer inherited all of the grandp ...

  2. 和安全有关的那些事(非对称加密、数字摘要、数字签名、数字证书、SSL、HTTPS及其他)

    转自http://blog.csdn.net/bluishglc/article/details/7585965 对于一般的开发人员来说,很少需要对安全领域内的基础技术进行深入的研究,但是鉴于日常系统 ...

  3. jQuery 判断是否为数字的方法 及 转换数字函数

    <script language="javascript"> var t=$("#id").val();//这个就是我们要判断的值了 if(!isN ...

  4. bitMap算法实现以及ckHash函数类,将字符串映射成数字,同时可以将数字映射成字符串

    ckHash函数类,将字符串映射成数字,同时可以将数字映射成字符串 说明 1.所谓的BitMap就是用一个bit位来标记某个元素所对应的value,而key即是该元素,由于BitMap使用了bit位来 ...

  5. 计算机二级-C语言-字符数字转化为整型数字。形参与实参类型相一致。double类型的使用。

    //函数fun功能:将a和b所指的两个字符串分别转化成面值相同的整数,并进行相加作为函数值返回,规定只含有9个以下数字字符. //重难点:字符数字转化为整型数字. #include <stdio ...

  6. isNaN() 函数用于检查其参数是否是非数字值。如果是非数字值则返回true

    isNaN() 函数用于检查其参数是否是非数字值.如果是非数字值则返回true.document.write(isNaN(0)); falsedocument.write(isNaN("He ...

  7. 一串数字中,只有一个数字出现一次,其他数字都出现两次,查找出这个数字(python)(原创)

    背景: 电话面试&手撕代码 2019.03.22 Mufasa 问题: 一串数字中,只有一个数字出现一次,其他数字都出现两次,查找出这个数字 条件: 这串数字是有序数 解决方法: 核心代码只有 ...

  8. 在Xshell 6开NumLock时按小键盘上的数字键并不能输入数字

    小键盘问题 在Xshell 6上用vi的时候,开NumLock时按小键盘上的数字键并不能输入数字,而是出现一个字母然后换行(实际上是命令模式上对应上下左右的键).解决方法 选项Terminal-> ...

  9. 使用JFileChooser实现在指定文件夹下批量添加根据“数字型样式”或“非数字型样式”命令的文件夹

    2018-11-05 20:57:00开始写 Folder.java类 import javax.swing.JFrame; import javax.swing.JPanel; import jav ...

随机推荐

  1. Git-Git基本操作

    先来合个影 马上就要和之前实践遗留的数据告别了,告别之前是不是要留个影呢?在Git里,"留影"用的命令叫做tag,更加专业的术语叫做"里程碑"(打tag,或打标 ...

  2. getsupportfragmentmanager 没有这个方法

    让activity继承自fragmentactivity就行了.

  3. 码农与UI沟通的日常

    事情是这样的,这是一个兴趣群组的效果图. 我看了一眼没有帖子时的提示,觉得这样的提示 不走心 不能展现出我们团队对于人生及世界的深度理解和高尚的品格. 于是,我选择了表达内心的真实感受. 我觉得这完美 ...

  4. IOS开发学习笔记021-练习2

    只是简单练习一下,主要是学习里面的思想,处理问题的方法. 不过还有一个问题没想到解决方法. 那就是动态生成的按钮如何绑定按钮事件,请哪位大神指点一下啊.(知道怎么办了,原来是方法addTarget) ...

  5. caffe的python接口提取resnet101某层特征

    论文的caffemodel转化为tensorflow模型过程中越坑无数,最后索性直接用caffe提特征. caffe提取倒数第二层,pool5的输出,fc1000层的输入,2048维的特征 #codi ...

  6. python 文件(file)操作

    操作文件的一般流程有: 打开文件.文件处理.关闭文件 开开文件的模式有: r,只读模式(默认). w,只写模式.[不可读:不存在则创建:存在则删除内容:] a,追加模式.[不可读: 不存在则创建:存在 ...

  7. ALPHA 冲刺(一)

    目录 组员情况 组员1(组长):胡绪佩 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:凯琳 组员6:丹丹 组员7:家伟 组员8:政演 组员9:黄鸿杰 组员10:刘一好 组员11:何宇恒 展示组内 ...

  8. PAT1039

    小红想买些珠子做一串自己喜欢的珠串.卖珠子的摊主有很多串五颜六色的珠串,但是不肯把任何一串拆散了卖.于是小红要你帮忙判断一下,某串珠子里是否包含了全部自己想要的珠子?如果是,那么告诉她有多少多余的珠子 ...

  9. 【转】利用Behavior Designer制作敌人AI

    http://www.unity.5helpyou.com/3112.html 本篇unity3d教程,我们来学习下利用Behavior Designer行为树插件来制作敌人AI,下面开始! Beha ...

  10. JAVA 程序监控基础简述

    最近在项目中自感程序木有问题,也没有什么错误日志出来.但就是有人反映服务慢,有时连不上的情况.为了解决这么妖的问题只能去详细的看看运行中的程序到底出了什么情况,这时如果有个比较好的监控工具可以监控运行 ...