ACM__01背包,完全背包,多重背包
今天写题的时候碰到了一道完全背包题,可是没有看出来,乱写了一通,浪费了一个晚上,顺便复习一下背包的知识
01背包
每种物品只能选择一次或者不选,求背包容量内的最大价值
先给出状态转移方程:
f[i][j]=max(f[i-1][j],f[i-1][j-w[i]]+v[i]);
解释一下:f[i][j]表示的是前i个物品中,背包容量为j时,得到的最大价值;如果在容量为j时选择不放第i个物品,那么f[i][j]=f[i-1][j],f[i-1][j]表示前一个物品在容量j时的状态值;如果在容量为j时选择放第i个物品,那么f[i][j]=f[i-1][j-w[i]]+v[i],f[i-1][j-w[i]]+v[i]表示前一个物品得到的状态加上第i个物品的价值;自然而然,f[i][j]=max(f[i-1][j],f[i-1][j-w[i]]+v[i]);
下面是二维数组的代码,自己敲了一遍,加深印象
#include<cstdio>
int main()
{
int n,m,v[],w[],f[][];
scanf("%d %d",&m,&n);
for(int i=;i<=n;i++)
scanf("%d %d",&v[i],&w[i]);
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
if(w[i]<=j)
f[i][j]=max(f[i-][j],f[i-][j-w[i]]+v[i]);
else
f[i][j]=f[i-][j];
}
}
printf("%d",f[n][m]);
return ;
}
还有一种是一维数组的方法,更能节省空间
#include<cstdio>
int main()
{
int n,m,v[],w[],f[];
scanf("%d %d",&m,&n);
for(int i=;i<=n;i++)
scanf("%d %d",&v[i],&w[i]);
for(int i=;i<=n;i++)
{
for(int j=m;j>=;j--)
{
if(w[i]<=j)
f[j]=max(f[j],f[j-w[i]]+v[i]);
}
}
printf("%d",f[m]);
return ;
}
里面第二个循环为什么要倒着来,遍历到第i个物品时,f[j]应该与第i-1个物品的状态比较,如果顺着来的话,f[j]则与第i个物品的状态进行了比较,这样会出事的;
完全背包
每种物品可以选无数次,求背包容量内的最大价值
状态转移方程为:f[j]=max(f[j],f[j-w[i]]+v[i]);
贴上代码:
#include<cstdio>
int main()
{
int n,m,v[],w[],f[];
scanf("%d %d",&m,&n);
for(int i=;i<=n;i++)
scanf("%d %d",&v[i],&w[i]);
for(int i=;i<=n;i++)
{
for(int j=w[i];j<=m;j++)
{
f[j]=max(f[j],f[j-w[i]]+v[i]);
}
}
printf("%d",f[m]);
return ;
}
多重背包
每种物品能取有限次,求背包容量内的最大值
多重背包问题化作01背包问题解决,如果价值为v的物品有x个,则化成x个价值为v的物品;
#include<cstdio>
int main()
{
int n,m,v[105],w[105],f[105];
scanf("%d %d",&m,&n);
for(int i=1; i<=n; i++)
scanf("%d %d",&v[i],&w[i],&num[i]);
int k=n+1;
for(int i=1; i<=n; i++)
{
for(int j=1; j<num[i]; j++)
{
v[k]=v[i];
w[k]=w[i];
k++;
}
}
for(int i=1; i<k; i++)
{
for(int j=m; j>=1; j--)
{
if(w[i]<=j)
f[j]=max(f[j],f[j-w[i]]+v[i]);
}
}
printf("%d",f[m]);
return 0;
}
再贴上今天折腾了一晚上的题:http://acm.sdibt.edu.cn/JudgeOnline/problem.php?id=2340
把数组改为全局变量竟然就A了,问了老谭,说这是,没有清零的原因,脑瓜子疼!
ACM__01背包,完全背包,多重背包的更多相关文章
- HDU 1114 完全背包 HDU 2191 多重背包
HDU 1114 Piggy-Bank 完全背包问题. 想想我们01背包是逆序遍历是为了保证什么? 保证每件物品只有两种状态,取或者不取.那么正序遍历呢? 这不就正好满足完全背包的条件了吗 means ...
- [原]hdu2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活 (这个只是题目名字) (多重背包)
本文出自:http://blog.csdn.net/svitter 原题:http://acm.hdu.edu.cn/showproblem.php?pid=2191 题意:多重背包问题.转换成为01 ...
- POJ1276 - Cash Machine(多重背包)
题目大意 给定一个容量为M的背包以及n种物品,每种物品有一个体积和数量,要求你用这些物品尽量的装满背包 题解 就是多重背包~~~~用二进制优化了一下,就是把每种物品的数量cnt拆成由几个数组成,1,2 ...
- POJ 1742 Coins(多重背包, 单调队列)
Description People in Silverland use coins.They have coins of value A1,A2,A3...An Silverland dollar. ...
- HDU1059 二进制拆分优化多重背包
/*问你能不能将给出的资源平分成两半,那么我们就以一半为背包,运行多重背包模版 但是注意了,由于个数过大,直接运行会超时,所以要用二进制拆分每种的个数*/ #include<stdio.h> ...
- 01背包模板、全然背包 and 多重背包(模板)
转载请注明出处:http://blog.csdn.net/u012860063 贴一个自觉得解说不错的链接:http://www.cppblog.com/tanky-woo/archive/2010/ ...
- DZY Loves Math II:多重背包dp+组合数
Description Input 第一行,两个正整数 S 和 q,q 表示询问数量.接下来 q 行,每行一个正整数 n. Output 输出共 q 行,分别为每个询问的答案. Sample Inpu ...
- 洛谷P1782 旅行商的背包[多重背包]
题目描述 小S坚信任何问题都可以在多项式时间内解决,于是他准备亲自去当一回旅行商.在出发之前,他购进了一些物品.这些物品共有n种,第i种体积为Vi,价值为Wi,共有Di件.他的背包体积是C.怎样装才能 ...
- HDU 2082 找单词 (多重背包)
题意:假设有x1个字母A, x2个字母B,..... x26个字母Z,同时假设字母A的价值为1,字母B的价值为2,..... 字母Z的价值为26.那么,对于给定的字母,可以找到多少价值<=50的 ...
随机推荐
- ROS routeros mikrotik路由器CVE-2018-14847漏洞
原文: https://securitynews.sonicwall.com/xmlpost/massive-cryptojacking-campaign/ SonicWall is observin ...
- CDN上的缓存刷新、缓存预热是怎样的使用场景?
缓存刷新 源站内容更新后,希望用户可以获取到最新资源,CDN租户可以通过提交刷新请求将CDN节点上指定的缓存内容强制过期.当用户再次访问时,CDN节点将回源获取已更新内容返回给用户并在节点缓存最新资源 ...
- webview自总结
2,webview ---- 运行时不调用系统自带浏览器: 1,安卓webview post传值问题: 11,WebView基本功能(html5.文件下载和远程URL) 10,webview--网络超 ...
- RAC集群安装校验输出信息
RAC集群安装校验输出信息 作者:Eric 微信:loveoracle11g [grid@rac-node1 grid]$ [grid@rac-node1 grid]$ ./runcluvfy.sh ...
- Linux双网卡绑定
Linux双网卡绑定 作者:Eric 微信:loveoracle11g eth0和eth1绑定为bond0 [root@rac-node1 ~]# cat /etc/sysconfig/network ...
- 字符串格式化format使用
顺序传参 '{}....{}'.format(value1, value2) 索引传参 '{0}....{1}'.format(value1, value2) 关键字传参 '{k1}....{k2}' ...
- ipv6 操作
netsh interface teredo set state disablednetsh interface ipv6 add v6v4tunnel interface=IP6Tunnel 120 ...
- win7禁用Adnimistrator账号登录
开始 运行 输入 lusrmgr.msc 回车. 双击 用户,双击Administrator ,在 账户已禁用 前面打上勾即可.然后确定.
- @Autowired与@Resource 详细诠释和区别(附带例子)
@Autowired 与@Resource:1.@Autowired与@Resource都可以用来装配bean. 都可以写在字段上,或写在setter方法上. 2.@Autowired默认按类型装配( ...
- MySQL管理工具HeidiSQL
MySQL管理工具HeidiSQL HeidiSQL 是一个功能非常强大的 MySQL 客户端软件.它是德国程序员Ansgar Becker和几个Delphi程序员开发的一个开源工具.要通过Hei ...