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 ...
随机推荐
- 《C陷阱与缺陷》整理二
1.数组名作实參 在C语言中,我们没有办法将一个数组作为函数參数传递,假设我们使用数组名作为參数.这个时候数组名立马会被转换为指向该数组的第一个元素的指针. 关于这一点的理解能够向前深 ...
- PAT 1002 Hello World for U (20)
Given any string of N (>=5) characters, you are asked to form the characters into the shape of U. ...
- Eclipse更改默认工作目录的方法
参考: Eclipse更改默认工作目录的方法:http://blog.163.com/take_make/blog/static/208212210201272611406227/ 用记事本打开&qu ...
- Thymeleaf Javascript 取值
<script th:inline="javascript"> var openid = /*[[${session.wxuser.openId}]]*/ </s ...
- Qt中用正則表達式来推断Text的语种,主要通过推断unicode的编码范围
QString MainWindow::ParseLanguage(QString Text) { if(Text.length()<=0) { return & ...
- web端、android端的文件上传
1.web端的文件上传. 这里是利用了第三方的jar包.这里所需要的jar包我已经上传到本博客的资源里了,以下是连接 http://download.csdn.net/detail/caihongsh ...
- SilkTest Q&A 9
Q81:我应该如何存取excel sheet里面的空字符串? A81:定制代码如下: 解决方案1: [-] if sText!=NULL [ ] Page.tfldName.SetText(sText ...
- HTML5 实现拖拽
如图 可以从第一个方框拖拽花色到第二个方框中. 也可以再拖动回来. 具体代码实现 index.html <!DOCTYPE HTML> <html> <head> ...
- 主从mysql 同步设置
GRANT REPLICATION SLAVE ON *.* TO 'root'@'%' IDENTIFIED BY 'zhoubt';grant all privileges on *.* to ...
- Spring MVC+JSP实现三级联动
jsp代码 <script type="text/javascript"> $(function() { initProvinces(); }); /** * 获取省列 ...