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 ...
随机推荐
- Python学习笔记 — 函数
函数是对程序逻辑进行结构化或过程化的一种编程方法.函数具有两个方面的意义:1)将代码分块,易于管理和阅读:2)最大化代码复用和最小化代码冗余,节省空间,有助于保持一致性. 1. 函数定义 Python ...
- Adrnoid开发系列(二十五):使用AlertDialog创建各种类型的对话框
AlertDialog能够生成各种内容的对话框.可是每种对话框都会有这样的的结构: 类似下边这样的的: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTA ...
- 增强SEO的div+css命名规则
页头:header登录条:loginBar标志:logo侧栏:sideBar广告:banner导航:nav子导航:subNav菜单:menu子菜单:subMenu搜索:search滚动:scroll页 ...
- 在webform中调用JS的技巧
一,执行删除操作,点击按钮时弹出对话框询问是否确认删除,点击确定,删除并在删除完成后弹出删除成功:点击取消不删除 1.在aspx源 代码中加入JavaScript代码 <script langu ...
- 1.1.0-学习Opencv与MFC混合编程之---全屏截图,保存为BMP图像(并增加快捷键)
源代码:http://download.csdn.net/detail/nuptboyzhb/3961677 Ø 添加全屏截图菜单项,菜单项的属性如下; Ø 为该菜单项建立类向导. 编辑消息处理函 ...
- linux设备驱动程序注冊过程具体解释
Linux的驱动程序注冊过程,大致分为两个步骤: 模块初始化 驱动程序注冊 以下以内核提供的演示样例代码pci-skeleton.c,具体说明一个pci设备驱动程序的注冊过程.其它设备的驱动代码注冊过 ...
- Android ListView 单条刷新方法实践及原理解析
对于使用listView配合adapter进行刷新的方法大家都不陌生,先刷新adapter里的数据,然后调用notifydatasetchange通知listView刷新界面. 方法虽然简单,但这里面 ...
- UVA 311 Packets 贪心+模拟
题意:有6种箱子,1x1 2x2 3x3 4x4 5x5 6x6,已知每种箱子的数量,要用6x6的箱子把全部箱子都装进去,问需要几个. 一开始以为能箱子套箱子,原来不是... 装箱规则:可以把箱子都看 ...
- eclipse3.2 汉化 汉化包下载
1.首先去www.eclipse.org下载eclipse3.2 点击下载eclipse3.2 2.再去www.eclipse.org下载它的汉化包 请使用迅雷等下载工具下载汉化包 注意不同版 ...
- 如何获取本地html文件的标题
本文用于提取本地网页的标签元素如<TITLE></TITLE>,<IMG>,<A></A>...的内容,非常实用于批量文件的操作,这是按一般 ...