题目描述:第一行:给你两个数m和n,m表示有m个数,然后下一行输入m个数,每个数只能选择一次,统计共有多少种情况使得所选数的和大于等于n;

解决本题我想到了两种方法,(题目自己想的,先不考虑超时),第一种dfs(题目自己想的,先不考虑超时)第二种:01背包问题;

dfs 由于递归的结束条件放错了导致最后结果中重复算了很多次,经过分析修改才得出结果;

第一种方法代码:

  1. #include<iostream>
  2. #include<algorithm>
  3. #include<cstdio>
  4. using namespace std;
  5. int ans;
  6. int a[];
  7. int m , n;
  8. void dfs(int i,int sum)
  9. {
  10. if(i>=m)//一开始错了很久,写成了if(i>=m) return ;后来发现次数变多了
  11. {
  12. if(sum>=n)
  13. {
  14. //printf("sum == %d\n",sum);
  15. ans++;
  16. }
  17. return ;
  18. }
  19. dfs(i+,sum); //要
  20. dfs(i+,sum+a[i+]);//不要
  21. }
  22. int main()
  23. {
  24. while(cin>>m>>n)
  25. {
  26. ans = ;
  27. for(int i = ;i<=m; i++)
  28. scanf("%d",&a[i]);
  29. dfs(,);
  30. cout<<ans<<endl;
  31. }
  32. return ;
  33. }

第二种方法动态规划:状态转移方程  dp[i][j] = dp[i-1][j] + dp[i-1][j-a[i]];

  1. #include<iostream>
  2. #include<algorithm>
  3. #include<cstdio>
  4. #include<cstring>
  5. using namespace std;
  6. const int N = ;
  7. int dp[N][N];
  8. int a[];
  9. int m , n;
  10. int main()
  11. {
  12. while(cin>>m>>n)
  13. { int sum = ,ans = ;
  14. for(int i = ;i<=m; i++)
  15. {
  16. scanf("%d",&a[i]);
  17. sum = sum + a[i];
  18. }
  19. memset(dp,,sizeof(dp));
  20. dp[][] = ;
  21. for(int i = ; i<=m; i++)
  22. {
  23. for(int j = ;j<=sum;j++)
  24. {
  25. dp[i][j] = dp[i-][j]+dp[i-][j-a[i]];
  26. //printf("i=%d j=%d %d\n",i,j,dp[i][j]);
  27. }
  28. }
  29. ans = ;
  30. for(int i = n;i<=sum;i++)
  31. ans = ans +dp[m][i];
  32. printf("%d",ans);
  33. }
  34. return ;
  35. }

ny1189  题目描述:和上面的描述类似,只不过是把加号变成了 异或和而已,解题思想类似,数据量大,直接开辟数组,存不下,只能压缩,dfs必然会超时

代码:

  1. #include<iostream>
  2. #include<algorithm>
  3. #include<cstdio>
  4. #include<cstring>
  5. using namespace std;
  6. const int N = ;
  7. long long dp[][N];
  8. long long a[];
  9. int m , n;
  10. int main()
  11. {
  12. int ma;
  13. while(cin>>m>>n)
  14. { long long ma = ;
  15. memset(dp,,sizeof(dp));
  16. for(int i = ;i<=m; i++)
  17. {
  18. scanf("%lld",&a[i]);
  19. ma=max(ma,a[i]);//每次都存储最大的值
  20. }
  21. dp[][] = ;
  22. for(int i = ; i<=m; i++)
  23. { memset(dp[i%],,sizeof(dp[i%])); //只是用了两层的循环,这样很简单的减少了空间的用量
  24. for(int j = ;j<=ma;j++)
  25. {
  26. dp[i%][j^a[i]] = dp[(i+)%][j]+dp[i%][j^a[i]];//要
  27. dp[i%][j] = dp[i%][j] + dp[(i+)%][j];//不要
  28. if(ma<(j^a[i]))
  29. ma = (j^a[i]);
  30. }
  31. }
  32. long long ans = ;
  33. for(int i = n;i<=ma;i++)
  34. ans = ans +dp[m%][i];
  35. printf("%lld\n",ans);
  36. }
  37. return ;
  38. }

一个简单题,引发的思索 + nyoj 1189的更多相关文章

  1. 一个JAVA题引发的思考

    转载自:http://www.cnblogs.com/heshan664754022/archive/2013/03/24/2979495.html 十年半山 今天在论坛闲逛的时候发现了一个很有趣的题 ...

  2. 一个简单问题引发对IEnumerable和IQueryable的思考

    问题概述:    首先看下图,有客户表和客户负责人表关系是多对多,访问数据库使用的是EF所以这里我们开启了延迟加载,需求就是将每个客户的所有负责人逗号拼接显示在负责人这一栏位, 对你没看错需求就是这么 ...

  3. 一个简单算法题引发的思考<DNA sorting>(about cin/template/new etc)

    首先是昨天在北京大学oj网上看到一个简单的算法题目,虽然简单,但是如何完成一段高效.简洁.让人容易看懂的代码对于我这个基础不好,刚刚进入计算机行业的小白来说还是有意义的.而且在写代码的过程中,会发现自 ...

  4. NYOJ 1009 So Easy[Ⅰ]【简单题】

    /* 题目大意:求三角形的外接圆 解题思路:c/sin(C)=2R,先求出cos,在求出sin 关键点:直接调用库 解题人:lingnichong 解题时间:2014-10-18 10:19:33 解 ...

  5. NYOJ 821 简单求值【简单题】

    /* 解题人:lingnichong 解题时间:2014.10.18   00:46 解题体会:简单题 */ 简单求值 时间限制:1000 ms  |  内存限制:65535 KB 难度:1 描写叙述 ...

  6. 大话JS面向对象之扩展篇 面向对象与面向过程之间的博弈论(OO Vs 过程)------(一个简单的实例引发的沉思)

    一,总体概要 1,笔者浅谈 我是从学习Java编程开始接触OOP(面向对象编程),刚开始使用Java编写程序的时候感觉很别扭(面向对象式编程因为引入了类.对象.实例等概念,非常贴合人类对于世间万物的认 ...

  7. (hdu 简单题 128道)平方和与立方和(求一个区间的立方和和平方和)

    题目: 平方和与立方和 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  8. NYOJ 330 一个简单的数学

    一个简单的数学题 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描写叙述 zyc近期迷上了数学,一天,dj想出了一道数学题来难住他.算出1/n,但zyc一时答不上来希望大家能 ...

  9. 一个简单的特效引发的大战之移动开发中我为什么放弃jquery mobile

    我本想安静的做一个美男子,可是,老板不涨工资,反而,一月不如一月. 我为什么放弃jquery mobile插件选择自己写特效? 在开发中大家都知道效率很重要,一个好的工具可以在开发中大大提升效率,工作 ...

随机推荐

  1. [Android Pro] 关于BitmapFactory.decodeStream(is)方法无法正常解码为Bitmap对象的解决方法

    在android sdk 1.6版本API帮助文档中,其中关于BitmapFactory.decodeFactory.decodeStream(InputStream is)的帮助文档是这么说明的: ...

  2. phpstorm不安装apache就可以本地测试PHP

    最近再搞个PHP的项目,找了很多发现phpstorm这个非常小巧而且很好用,,顺便推荐一下idea开发android非常不错,这2个IDE都是一家公司的.本文由智动软件(zdexe.com)原创,转载 ...

  3. go语言基础之Printf和Println的区别

    1.示例 package main //必须有一个main包 import "fmt" func main() { a := 10 //一段一段处理,自动加换行 fmt.Print ...

  4. Tomcat9 访问 Manager App

    1.介绍 在配置好Tomcat,我们往往需要访问Tomcat的Manager以及Host Manager.就需要在tomcat-users.xml中配置用户角色来实现.在地址栏输入:localhost ...

  5. [Python爬虫] 之十四:Selenium +phantomjs抓取媒介360数据

    具体代码如下: # coding=utf-8import osimport refrom selenium import webdriverimport selenium.webdriver.supp ...

  6. 北邮连接bupt-mobile

    内容源自:[伪攻略]电脑(win10)连接BUPT-mobile教程 1.控制面板:控制面板\网络和 Internet\网络连接 右键——属性,记住网络配置器的名字(划线部分) 点击配置——高级——网 ...

  7. 在android中画圆形图片的几种办法

    在开发中常常会有一些需求,比方显示头像,显示一些特殊的需求,将图片显示成圆角或者圆形或者其它的一些形状. 可是往往我们手上的图片或者从server获取到的图片都是方形的.这时候就须要我们自己进行处理, ...

  8. 病毒木马查杀实战第015篇:U盘病毒之脱壳研究

    前言 因为我们的终于目标是编写出针对于这次的U盘病毒的专杀工具.而通过上次的分析我们知道,病毒有可能在不同的计算机中会以不同的名称进行显示.假设真是如此,那么就有必要在此分析出病毒的命名规律等特征,然 ...

  9. Unity3d 录像

    flashtd1: 回复 tqfa :我觉得是有方法可以实现的,之前使用高通的增强显示开发包时发现其实它是添加了一个类似movietexture的东西,叠加在它的摄像机上 如果文档里有操作moviet ...

  10. c++11 Using Callable Objects, std::thread, std::bind, std::async, std::call_once