一个简单题,引发的思索 + nyoj 1189
题目描述:第一行:给你两个数m和n,m表示有m个数,然后下一行输入m个数,每个数只能选择一次,统计共有多少种情况使得所选数的和大于等于n;
解决本题我想到了两种方法,(题目自己想的,先不考虑超时),第一种dfs(题目自己想的,先不考虑超时)第二种:01背包问题;
dfs 由于递归的结束条件放错了导致最后结果中重复算了很多次,经过分析修改才得出结果;
第一种方法代码:
- #include<iostream>
- #include<algorithm>
- #include<cstdio>
- using namespace std;
- int ans;
- int a[];
- int m , n;
- void dfs(int i,int sum)
- {
- if(i>=m)//一开始错了很久,写成了if(i>=m) return ;后来发现次数变多了
- {
- if(sum>=n)
- {
- //printf("sum == %d\n",sum);
- ans++;
- }
- return ;
- }
- dfs(i+,sum); //要
- dfs(i+,sum+a[i+]);//不要
- }
- int main()
- {
- while(cin>>m>>n)
- {
- ans = ;
- for(int i = ;i<=m; i++)
- scanf("%d",&a[i]);
- dfs(,);
- cout<<ans<<endl;
- }
- return ;
- }
第二种方法动态规划:状态转移方程 dp[i][j] = dp[i-1][j] + dp[i-1][j-a[i]];
- #include<iostream>
- #include<algorithm>
- #include<cstdio>
- #include<cstring>
- using namespace std;
- const int N = ;
- int dp[N][N];
- int a[];
- int m , n;
- int main()
- {
- while(cin>>m>>n)
- { int sum = ,ans = ;
- for(int i = ;i<=m; i++)
- {
- scanf("%d",&a[i]);
- sum = sum + a[i];
- }
- memset(dp,,sizeof(dp));
- dp[][] = ;
- for(int i = ; i<=m; i++)
- {
- for(int j = ;j<=sum;j++)
- {
- dp[i][j] = dp[i-][j]+dp[i-][j-a[i]];
- //printf("i=%d j=%d %d\n",i,j,dp[i][j]);
- }
- }
- ans = ;
- for(int i = n;i<=sum;i++)
- ans = ans +dp[m][i];
- printf("%d",ans);
- }
- return ;
- }
ny1189 题目描述:和上面的描述类似,只不过是把加号变成了 异或和而已,解题思想类似,数据量大,直接开辟数组,存不下,只能压缩,dfs必然会超时
代码:
- #include<iostream>
- #include<algorithm>
- #include<cstdio>
- #include<cstring>
- using namespace std;
- const int N = ;
- long long dp[][N];
- long long a[];
- int m , n;
- int main()
- {
- int ma;
- while(cin>>m>>n)
- { long long ma = ;
- memset(dp,,sizeof(dp));
- for(int i = ;i<=m; i++)
- {
- scanf("%lld",&a[i]);
- ma=max(ma,a[i]);//每次都存储最大的值
- }
- dp[][] = ;
- for(int i = ; i<=m; i++)
- { memset(dp[i%],,sizeof(dp[i%])); //只是用了两层的循环,这样很简单的减少了空间的用量
- for(int j = ;j<=ma;j++)
- {
- dp[i%][j^a[i]] = dp[(i+)%][j]+dp[i%][j^a[i]];//要
- dp[i%][j] = dp[i%][j] + dp[(i+)%][j];//不要
- if(ma<(j^a[i]))
- ma = (j^a[i]);
- }
- }
- long long ans = ;
- for(int i = n;i<=ma;i++)
- ans = ans +dp[m%][i];
- printf("%lld\n",ans);
- }
- return ;
- }
一个简单题,引发的思索 + nyoj 1189的更多相关文章
- 一个JAVA题引发的思考
转载自:http://www.cnblogs.com/heshan664754022/archive/2013/03/24/2979495.html 十年半山 今天在论坛闲逛的时候发现了一个很有趣的题 ...
- 一个简单问题引发对IEnumerable和IQueryable的思考
问题概述: 首先看下图,有客户表和客户负责人表关系是多对多,访问数据库使用的是EF所以这里我们开启了延迟加载,需求就是将每个客户的所有负责人逗号拼接显示在负责人这一栏位, 对你没看错需求就是这么 ...
- 一个简单算法题引发的思考<DNA sorting>(about cin/template/new etc)
首先是昨天在北京大学oj网上看到一个简单的算法题目,虽然简单,但是如何完成一段高效.简洁.让人容易看懂的代码对于我这个基础不好,刚刚进入计算机行业的小白来说还是有意义的.而且在写代码的过程中,会发现自 ...
- NYOJ 1009 So Easy[Ⅰ]【简单题】
/* 题目大意:求三角形的外接圆 解题思路:c/sin(C)=2R,先求出cos,在求出sin 关键点:直接调用库 解题人:lingnichong 解题时间:2014-10-18 10:19:33 解 ...
- NYOJ 821 简单求值【简单题】
/* 解题人:lingnichong 解题时间:2014.10.18 00:46 解题体会:简单题 */ 简单求值 时间限制:1000 ms | 内存限制:65535 KB 难度:1 描写叙述 ...
- 大话JS面向对象之扩展篇 面向对象与面向过程之间的博弈论(OO Vs 过程)------(一个简单的实例引发的沉思)
一,总体概要 1,笔者浅谈 我是从学习Java编程开始接触OOP(面向对象编程),刚开始使用Java编写程序的时候感觉很别扭(面向对象式编程因为引入了类.对象.实例等概念,非常贴合人类对于世间万物的认 ...
- (hdu 简单题 128道)平方和与立方和(求一个区间的立方和和平方和)
题目: 平方和与立方和 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- NYOJ 330 一个简单的数学
一个简单的数学题 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描写叙述 zyc近期迷上了数学,一天,dj想出了一道数学题来难住他.算出1/n,但zyc一时答不上来希望大家能 ...
- 一个简单的特效引发的大战之移动开发中我为什么放弃jquery mobile
我本想安静的做一个美男子,可是,老板不涨工资,反而,一月不如一月. 我为什么放弃jquery mobile插件选择自己写特效? 在开发中大家都知道效率很重要,一个好的工具可以在开发中大大提升效率,工作 ...
随机推荐
- [Android Pro] 关于BitmapFactory.decodeStream(is)方法无法正常解码为Bitmap对象的解决方法
在android sdk 1.6版本API帮助文档中,其中关于BitmapFactory.decodeFactory.decodeStream(InputStream is)的帮助文档是这么说明的: ...
- phpstorm不安装apache就可以本地测试PHP
最近再搞个PHP的项目,找了很多发现phpstorm这个非常小巧而且很好用,,顺便推荐一下idea开发android非常不错,这2个IDE都是一家公司的.本文由智动软件(zdexe.com)原创,转载 ...
- go语言基础之Printf和Println的区别
1.示例 package main //必须有一个main包 import "fmt" func main() { a := 10 //一段一段处理,自动加换行 fmt.Print ...
- Tomcat9 访问 Manager App
1.介绍 在配置好Tomcat,我们往往需要访问Tomcat的Manager以及Host Manager.就需要在tomcat-users.xml中配置用户角色来实现.在地址栏输入:localhost ...
- [Python爬虫] 之十四:Selenium +phantomjs抓取媒介360数据
具体代码如下: # coding=utf-8import osimport refrom selenium import webdriverimport selenium.webdriver.supp ...
- 北邮连接bupt-mobile
内容源自:[伪攻略]电脑(win10)连接BUPT-mobile教程 1.控制面板:控制面板\网络和 Internet\网络连接 右键——属性,记住网络配置器的名字(划线部分) 点击配置——高级——网 ...
- 在android中画圆形图片的几种办法
在开发中常常会有一些需求,比方显示头像,显示一些特殊的需求,将图片显示成圆角或者圆形或者其它的一些形状. 可是往往我们手上的图片或者从server获取到的图片都是方形的.这时候就须要我们自己进行处理, ...
- 病毒木马查杀实战第015篇:U盘病毒之脱壳研究
前言 因为我们的终于目标是编写出针对于这次的U盘病毒的专杀工具.而通过上次的分析我们知道,病毒有可能在不同的计算机中会以不同的名称进行显示.假设真是如此,那么就有必要在此分析出病毒的命名规律等特征,然 ...
- Unity3d 录像
flashtd1: 回复 tqfa :我觉得是有方法可以实现的,之前使用高通的增强显示开发包时发现其实它是添加了一个类似movietexture的东西,叠加在它的摄像机上 如果文档里有操作moviet ...
- c++11 Using Callable Objects, std::thread, std::bind, std::async, std::call_once