nyist oj 311 全然背包 (动态规划经典题)
全然背包
- 描写叙述
-
直接说题意,全然背包定义有N种物品和一个容量为V的背包。每种物品都有无限件可用。第i种物品的体积是c,价值是w。
求解将哪些物品装入背包可使这些物品的体积总和不超过背包容量,且价值总和最大。本题要求是背包恰好装满背包时,求出最大价值总和是多少。
假设不能恰好装满背包,输出NO
- 输入
- 第一行: N 表示有多少组測试数据(N<7)。
接下来每组測试数据的第一行有两个整数M。V。 M表示物品种类的数目,V表示背包的总容量。(0<M<=2000,0<V<=50000)
接下来的M行每行有两个整数c,w分别表示每种物品的重量和价值(0<c<100000,0<w<100000) - 输出
- 相应每组測试数据输出结果(假设能恰好装满背包,输出装满背包时背包内物品的最大价值总和。
假设不能恰好装满背包,输出NO)
- 例子输入
-
2
1 5
2 2
2 5
2 2
5 1 - 例子输出
-
NO
1 -
上传者
userid=ACM_%E8%B5%B5%E9%93%AD%E6%B5%A9" style="text-decoration:none; color:rgb(55,119,188)">ACM_赵铭浩
动态规划经典题;也有几种思路,最优的思路把01背包问题的第二重循环的顺序改一下,就得到了全然背包的最优解法;
这个算法使用一维数组,先看伪代码:(引用的背包9讲里面的内容)
for i=1..N
for v=0..V
f[v]=max{f[v],f[v-cost]+weight}
你会发现,这个伪代码与01背包的伪代码仅仅有v的循环次序不同而已。 为什么这样一改就可行呢?首先想想为什么P01中要依照v=V..0的逆序来循环。
这是由于要保证第i次循环中的状态f[i][v]是由状态f[i-1] [v-c[i]]递推而来。换句话说。这正是为了保证每件物品仅仅选一次。保证在考虑“选入第i件物品”这件策略时,根据的是一个绝无已经选入第i件物品的 子结果f[i-1][v-c[i]]。而如今全然背包的特点恰是每种物品可选无限件。所以在考虑“加选一件第i种物品”这样的策略时,却正须要一个可能已选入第i种物品的子结果f[i][v-c[i]],所以就能够而且必须採用v=0..V的顺序循环。这就是这个简单的程序为何成立的道理。
值得一提的是,上面的伪代码中两层for循环的次序能够颠倒。这个结论有可能会带来算法时间常数上的优化。
这个算法也能够以另外的思路得出。
比如。将基本思路中求解f[i][v-c[i]]的状态转移方程显式地写出来,代入原方程中,会发现该方程能够等价地变形成这样的形式:
f[i][v]=max{f[i-1][v],f[i][v-c[i]]+w[i]}
将这个方程用一维数组实现,便得到了上面的伪代码。
以下是实现的代码;动态规划的代码都非常easy,最重要的是掌握当中的状态转移方程:
#include <cstdio>
#include <cstring>
#define max(a,b) a>b? a:b
const int maxn=50001;
int dp[maxn];
int main()
{
int n,m,v,i,j,c,w;
scanf("%d",&n);
while(n--)
{
memset(dp,-10000,sizeof(dp));//这里也要注意,在01背包中初始化给的是0,这里要初始化一个比較大的负数
dp[0]=0;//这里也要注意,没有这个就会wa
scanf("%d%d",&m,&v);
for(i=1;i<=m;i++)
{
scanf("%d%d",&c,&w);
for(j=c;j<=v;j++)
dp[j]=max(dp[j],dp[j-c]+w);//状态转移方程也和01背包一致
}
if(dp[v]<0) printf("NO\n");
else printf("%d\n",dp[v]);
}
return 0;
}
nyist oj 311 全然背包 (动态规划经典题)的更多相关文章
- nyist oj 79 拦截导弹 (动态规划基础题)
拦截导弹 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描写叙述 某国为了防御敌国的导弹突击.发展中一种导弹拦截系统.可是这样的导弹拦截系统有一个缺陷:尽管它的第一发炮弹可以 ...
- HDU 1114 Piggy-Bank 全然背包
Piggy-Bank Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit S ...
- HDU 1248 寒冰王座(全然背包:入门题)
HDU 1248 寒冰王座(全然背包:入门题) http://acm.hdu.edu.cn/showproblem.php?pid=1248 题意: 不死族的巫妖王发工资拉,死亡骑士拿到一张N元的钞票 ...
- HDU 1284 钱币兑换问题(全然背包:入门题)
HDU 1284 钱币兑换问题(全然背包:入门题) http://acm.hdu.edu.cn/showproblem.php?pid=1284 题意: 在一个国家仅有1分,2分.3分硬币,将钱N ( ...
- 【转载】 HDU 动态规划46题【只提供思路与状态转移方程】
1.Robberies 连接 :http://acm.hdu.edu.cn/showproblem.php?pid=2955 背包;第一次做的时候把概率当做背包(放大100000倍化为整数) ...
- [2012山东ACM省赛] Pick apples (贪心,全然背包,枚举)
Pick apples Time Limit: 1000MS Memory limit: 165536K 题目描写叙述 Once ago, there is a mystery yard which ...
- (全然背包)小P寻宝记——好基友一起走
题目描写叙述 话说.上次小P到伊利哇呀国旅行得到了一批宝藏.他是相当开心啊.回来就告诉了他的好基友小鑫.于是他们又结伴去伊利哇呀国寻宝. 这次小P的寻宝之路可没有那么的轻松,他们走到了一个森林,小鑫一 ...
- HDU1114 Piggy-Bank 【全然背包】
Piggy-Bank Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total ...
- POJ 1384 POJ 1384 Piggy-Bank(全然背包)
链接:http://poj.org/problem?id=1384 Piggy-Bank Time Limit: 1000MS Memory Limit: 10000K Total Submissio ...
随机推荐
- vld(Visual Leak Detector) 内存泄露检测工具
初识Visual Leak Detector 灵活自由是C/C++语言的一大特色,而这也为C/C++程序员出了一个难题.当程序越来越复 杂时,内存的管理也会变得越加复杂,稍有不慎就会出现内存问题.内存 ...
- 在webx.ml中 配置struts2 后 welcome-file-list 失效的解决办法
struts2 <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>*.a ...
- 基于jquery-easyui的仓库管理系统
使用jQuery EasyUI创建的仓库管理系统包括系统管理.数据维护.业务单据管理等,有兴趣可以对其进行修改扩展. 数据库采用MYSQL, 帐号/密码:root/root,演示登录帐号/密码:adm ...
- Windows phone 8 学习笔记
Windows phone 8 学习笔记(1) 触控输入 http://www.apkbus.com/android-138547-1-1.html Windows phone 8 学习笔记(2) ...
- 十分钟开发一个调用Activity的PhoneGap插件
在HybridApp开发中,非常多业务我们是没有办法通过HTML5+js实现的,比方调用第三方的包括Activity的jar包,一些必须使用原生代码才干实现的功能,比方复杂的UI的效果,调用通讯相关的 ...
- Cocos2dx引擎10-事件派发
本文介绍Cocos2dx事件(以下简称Event)处理机制中的事件分发模块,在Event发生后,进过一系列处理,最后将会分发Event: 1.dispatchEvent& dispatchTo ...
- delphi删除只读文件
只读文件就是不能删除的文件,用DeleteFile函数对它来说是毫无意义的,要删除只读文件,只有先改变它的属性.如果你要删除一个文件,最好先作两个方面的考虑: (1)判断该文件的属性.可以用上面提到的 ...
- springboot 开发入门,及问题汇总
1 . springboot简单介绍(http://projects.spring.io/spring-boot/) 现在的web项目几乎都会用到spring框架,而要使用spring难免需要配置大量 ...
- Solaris 11的自动化安装(AI server)的搭建
solaris 11 总体比solaris 10很多变动的地方,可以去官方网站上面学习:http://www.oracle.com/technetwork/server-storage/solaris ...
- 找工作笔试面试那些事儿(16)---linux相关知识点(1)
linux这部分的知识倒不是笔试面试必考的内容,不过现在很多公司开发环境都在linux系统下,一些简单的知识还是需要了解一下的,笔试面试中万一碰到了,也不会措手不及.作为菜硕的我,又因为读研期间的项目 ...