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的 ...
随机推荐
- dropwizard使用cors支持跨域浏览器取不到自定义header问题
dropwizard支持cors的配置如下: public void run(Configuration conf, Environment environment) { // Enable CORS ...
- Kowala协议:一组分布式,自我调节,资产跟踪特性的加密货币(二)
对于稳定币来言,设计过程中会遇到很多细节的问题,今天来讲述下有关通证设计过程中的一些问题. 1.计算手续费 计算费是交易费的一部分,转移给kUSD矿工,并由以下公式决定: 其gasUsed(t) 是用 ...
- [UE4]删除动画:Remove from frame 5 to frame 18
从当前帧开始删除到结尾的动画帧
- Centos7修改系统时区timezone
第一步:查询服务器时间 [root@localhost ~]# timedatectl Local time: Sat 2018-03-31 01:11:46 UTC Universal time: ...
- window安装mysql教程
1.下载mysql安装包到指定文件: 比如如图我把下载的mysql zip的内容解压到这个文件里面,具体文件内容如下: my.ini 需要自己创建,里面的内容如下: [mysqld] #basedir ...
- Navicat Premium 将sqlserver 数据库 导入mysql 中
1.新建 MySQL 数据库 2. 3 4 5 6 7 8 9一直点击下一步 10 成功
- MySQL免安装配置(亲测过,请放心借鉴)
下载地址:https://dev.mysql.com/downloads/mysql 1.mysqld --initialize-insecure 初始化 2.mysqld install 安装服 ...
- 项目经验分享[转自min.jiang]
最近三个月,我非常荣幸的做为TeamLeader带领几个小组成员做了一个国外项目,这里想为大家分享一些小经验,尽管我佣有六年多的项目经验,但我一直的方向是架构师.大家知道架构师一般情况是偏向技 ...
- python中import和from-import的区别
. import导入模块的路径两种方式 # 将模块所在路径再程序中添加到sys.path列表中 import sys sys.path import导入模块按照sys.path顺序依次查找,“”代表当 ...
- python tkinter chk
视频过程中的练习, 可以在python2.7下运行. 001: hello,world: 1 2 3 4 5 6 from Tkinter import Label, Tk root = Tk() t ...