一个简单题,引发的思索 + 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内存优化2 了解java内存分配 2
JVM内存模型 Java虚拟机(Java Virtual Machine=JVM)的内存空间分为五个部分,分别是: 1. 程序计数器 2. Java虚拟机栈 3. 本地方法栈 4. 堆 5. 方法区. ...
- SSH远程连接连接其他主机,等待时间过长的原因。
ssh远程连接登录到其他主机,输入登录用户名,等待时间很长时间,然后才出现输入密码的提示.导致这样时间过长,太慢了的原因有两个.(1)当使用ssh远程登录到某个IP时,这个IP的主机系统会读取/etc ...
- java泛型介绍
一.泛型初衷 Java集合不会知道我们需要用它来保存什么类型的对象,所以他们把集合设计成能保存任何类型的对象,只要就具有很好的通用性.但这样做也带来两个问题: –集合对元素类型没有任何限制,这样可能引 ...
- UML类图介绍(转载)
UML类图详细介绍 类图主要描述程序对象以及他们之间的关系.一般来说,类.接口.抽象类这些程序对象的区别很容易,但是他们之间六种关系以前总是理解不够深刻,这次进行了一次复习,顺便写成博文以便加深理 ...
- vue - 选项
1.计算属性(computed):主要是对原数据进行改造输出.改造输出:包括格式化数据(价格,日期),大小写转换,排序,添加符号 2.methods(methods):用于绑定html中的事件对应的方 ...
- npm技巧
你看一个同事正在编码,其中应用上了一些简写和技巧,不知为何,你不熟悉它并且你的大脑一片混乱,这种场景发生在过去我们每个人身上. 在这篇短文中,我们将会介绍一些非常实用的 npm 技巧.有很多文章中的技 ...
- 近期面试Android的一些面试题
近期一个多月面试过一下公司(均为实习): 腾讯:内推一面卒. 正式校招拿到offer 阿里:内推二面卒. 蘑菇街:面完三面技术面,等待HR面 网易:拿到offer. 能够看到,大部分问题不难,可是能回 ...
- CSS 盒状模型简介
框的构成以及相关 CSS 特性( property ) 结构 为了给文档树中的各个元素排版定位(布局),浏览器会根据渲染模型1为每个元素生成四个嵌套的矩形框, 分别称作 content box.pad ...
- Python 二维码解码
二维码解析 Python中关于二维码解析的现成模块有很多,比较著名的就是Zbar以及ZXing.然而很不幸的是,官方的版本都是支持到python2.x,下面是在python2.x的例子: import ...
- Protocol Informatics (PI项目)【基于网络轨迹的协议逆向工程文献学习】
Protocol Informatics[基于网络轨迹的协议逆向工程文献学习]by tsy 声明: 1)本报告由博客园bitpeach撰写,版权所有,免费转载,请注明出处,并请勿作商业用途.恕作者著作 ...