一个简单题,引发的思索 + 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插件选择自己写特效? 在开发中大家都知道效率很重要,一个好的工具可以在开发中大大提升效率,工作 ...
随机推荐
- Netty游戏服务器之一
所谓磨刀不误砍柴工,所以在搭建netty游戏服务器之前,我们先要把要准备的东西做好. 首先进入netty的官网下载最新版本的netty的jar包,http://netty.io/downloads.h ...
- python scikit-learn选择正确估算器
下图摘自官方文档 链接 http://scikit-learn.org/stable/tutorial/machine_learning_map/index.html
- shader cycles静态分析
mali Mali Offline Compiler https://developer.arm.com/products/software-development-tools/graphics-de ...
- Razor语法(二)
I:ASP.NET MVC3在Visual Studio 2010中的变化 在VS2010中新建一个MVC3项目可以看出与以往的MVC2发生了很明显的变化. 1.ASP.NET MVC3必要的运行环境 ...
- 十招让Ubuntu 16.04用起来更得心应手
Ubuntu 16.04是一种长期支持版本(LTS),是Canonical承诺发布五年的更新版.也就是说,你可以让这个版本在电脑上运行五年!这样一来,一开始就设置好显得特别重要.你应该确保你的软件是最 ...
- bottle+cherrypy快速开发web服务
我目前用得最顺手的python web框架是bottle,简单方便. bottle有一个开发用的http服务器,效率不高,单线程,阻塞. 所以,得找个别的服务器来部署. 根据bottle官方的文档,发 ...
- javascript——正則表達式
正則表達式(RegExp对象):主要用于表单验证 1.创建正則表達式: (1).var ret = /pattern/; pattern是内容.能够是正則表達式的内容,能够是字符或是其它的内容 (2) ...
- Visual Studio2015 简体中文版 安装
VS2015简体中文版安装 导航 介绍 解决安装先决条件 安装 VS2015 创建桌面快捷方式 启动 VS2015 命令启动VS2015 配置 VS2015 启动完成 Visual Studio的功能 ...
- centos下安装pyspider
环境: * CentOS release 6.4 (Final) * Python 2.6.6 pip install pyspider ,发现lxml没有安装好 直接sudo yum insta ...
- wtforms 提示 中文 flask
#! /usr/bin/python3 # -*- coding: utf8 -*- from wtforms.fields.simple import TextField, PasswordFi ...