背包学习————完全背包
有N种物品和一个容量为V的背包,每种物品都有无限件可用。第i种物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。
1:f[i][v]=max{f[i-1][v-k*c[i]]+k*w[i]|0<=k*c[i]<=v}
2:f[v]=max(f[v],f[v-c[i]]+w[i]);
完全背包面临的不是对于第i件物品选不选的问题了而是选多少件了问题了。。。所以f[v]的当前状态允许由当前状态推得。
实现方法有是那种
1:o(n*v)
这里正确理解这句经典的话很关键(引用):
换句话说,这正是为了保证每件物品只选一次,保证在考虑“选入第i件物品”这件策略时,依据的是一个绝无已经选入第i件物品的子结果f[i-1][v-c[i]]。而现在完全背包的特点恰是每种物品可选无限件,所以在考虑“加选一件第i种物品”这种策略时,却正需要一个可能已选入第i种物品的子结果f[i][v-c[i]],所以就可以并且必须采用v=0..V的顺序循环。这就是这个简单的程序为何成立的道理。
http://acm.hdu.edu.cn/showproblem.php?pid=1114
![](/assets/blank.gif)
![](/assets/blank.gif)
#include <iostream>#include<cstdio>#include<cstring>using namespace std;#define N 10007#define inf 9999999int c[N],w[N],f[N]; int main(){int t,n,i,j,V;int s,e; scanf("%d",&t);while(t--) { scanf("%d%d",&s,&e); V=e-s;for(i=1;i<=V;i++) f[i]=inf; f[0]=0; scanf("%d",&n);for(i=1;i<=n;i++) scanf("%d%d",&w[i],&c[i]);for(i=1;i<=n;i++) {for(j=c[i];j<=V;j++) f[j]=min(f[j],f[j-c[i]]+w[i]); }if(f[V]!=inf) printf("The minimum amount of money in the piggy-bank is %d.\n",f[V]);else printf("This is impossible.\n"); }return 0;}
2:转化成01背包每种物品是一个01背包的方法:
![](/assets/blank.gif)
![](/assets/blank.gif)
#include <cstdio>#include <iostream>#include <cstring>using namespace std;const int max_s = 100007;const int inf = 9999999;int c[max_s],w[max_s],f[max_s];int main(){int i,j,k,n,m,V,t,num; scanf("%d",&t);while(t--) { scanf("%d%d",&n,&m); V=m-n; scanf("%d",&num);for(i=0;i<num;i++) scanf("%d%d",&w[i],&c[i]); f[0]=0;for(i=1;i<=V;i++) f[i]=inf;for(i=0;i<num;i++) {for(j=1;j<=V/c[i];j++) {for(k=V;k>=c[i];k--) f[k]=min(f[k],f[k-c[i]]+w[i]); } }if(f[V]!=inf) printf("The minimum amount of money in the piggy-bank is %d.\n",f[V]);else printf("This is impossible.\n"); }return 0;}
3:利用二进制思想;
把第i种物品拆成费用为c[i]*2^k、价值为w[i]*2^k的若干件物品,其中k满足c[i]*2^k<=V
。这是二进制的思想,因为不管最优策略选几件第i种物品,总可以表示成若干个2^k件物品的和。这样把每种物品拆成O(log V/c[i])件物品,是一个很大的改进。(本人不大理解望大牛指点)未发现实现代码。。求解。。
转载于:https://www.cnblogs.com/E-star/archive/2011/12/06/2278244.html
背包学习————完全背包相关推荐
- 背包问题教程-01背包,完全背包,多重背包,混合背包 收藏
P01: 01背包问题 题目 有N件物品和一个容量为V的背包.第i件物品的费用是c[i],价值是w[i].求解将哪些物品装入背包可使价值总和最大. 基本思路 这是最基础的背包问题,特点是:每种物品仅有 ...
- 01背包和完全背包 的完整讲解版 包含 一维数组实现 和二维数组实现题目
(二)01背包和完全背包 的完整讲解版 包含 一维数组实现 和二维数组实现题目 //有N件物品和一个容量为V的背包.第i件物品的体积是c[i],价值是w[i].求解将哪些物品装入背包可使价值总和最大. ...
- 2022年小游戏----游戏背包系统之自定义填充背包和切换背包页面
文章目录 蓝图展示 UI_Main_Bag蓝图 UI_Main_Bag_Item蓝图 创建数据结构和数据表 创建数据结构 引用结构创建数据表 编辑UI_Main_Bag_Item图表 使用标签获取数据 ...
- 动态规划dp(带模板题の超易懂版):01背包,完全背包,分组背包,多重背包,混合背包
动态规划dp(带模板题の超易懂版):01背包,完全背包,分组背包,多重背包 01背包 && 完全背包 && 分组背包 の 视频教程:https://www.bilibi ...
- 01背包,完全背包C++实现
首先,上自己的代码,由于代码注释详细,我就不解释啦.看代码就好O(∩_∩)O. 代码转换为了01背包问题求解. 代码部分算法与测验数据数据参照了https://blog.csdn.net/xp7315 ...
- 背包详解:完全背包与多重背包
目录 完全背包 优化一:输入优化 优化二:二进制 优化三:重复放入的 01 背包 多重背包 总结 完全背包 有一个大小为 m 的背包,有 N 种物体,每种物品的价值为 Vi, 大小为 Ai, 并且每种 ...
- 浅说——九讲背包之01背包
所谓九讲,也就是: 0/1背包 0/1背包降维 完全背包 多重背包(二进制优化) 混合背包 二维费用背包 分组背包 有依赖的背包 背包的方案总数\背包的具体方案路径 0/1背包: [问题描述](经典) ...
- hdu 3732(01背包转多重背包)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3732 思路:这么大的数据,用01背包肯定会TLE的,01背包转多重背包..最多也就11*11=121件 ...
- 动态规划 4、基础背包问题总结(多重背包与多重背包的转化)
描述: 有N种物品和一个容量为V的背包.第i种物品最多有n[i]件可用,每件费用是c[i],价值是w[i].求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大. 变式:有的物品 ...
最新文章
- Microbiome:芝麻菜中肠杆菌科主导核心微生物组并贡献抗生素抗性组
- 通俗易懂理解GBDT算法原理-转
- 是固执成见还是步步为营,工程建筑行业如何追赶人工智能化潮流?
- archlinux 安装 Windows 字体
- 无法打开 configsource 文件
- 差生的底线和所谓的坚持不过是一个笑话
- 2018成都初二计算机会考时间,2018年四川学业水平考试时间及科目
- opencv学习笔记22:傅里叶变换,高通滤波,低通滤波
- Java方法中的参数太多,第8部分:工具
- html 盒子重叠,CSS3 box-shadow用于重叠的div
- signature=c0c1b69f720d190a4a817d6bf2ff57c3,Fungicidal substituted N-(1-iodopropargyl)thiazolidinones
- 提交数据网页设计_网站网页编写需要注意哪些问题?
- script脚本中写不写$(document).ready(function() {});的差别
- NWA Quality Analyst应用案例:在食品加工中选择和实施SPC软件
- 最新win10系统下载64位
- 如何使用谷歌搜索API来获取结果
- 计算机图标下面有颜色,小编教你电脑桌面图标有蓝色阴影怎么去掉
- Django 开发微信公众号
- postman 9.16 打不开怎么办
- python的字典-使用字典+遍历字典+字典嵌套
热门文章
- python random 和numpy random_Python中numpy.random和random.random之间的区别
- 电脑上怎么做pdf文件_PDF压缩文件怎么压缩最小?请收好这些PDF压缩方法
- linux 使用nginx 权限不够,对于nginx和Linux,有一些关于权限的问题。
- mysql proxy 管理_ProxyMySQL的Admin管理接口
- java methodtype_java基于MethodHandle调用方法
- linux中firefox替换,Ubuntu更换Firefox版本的方法
- loading怎么关闭 vant_vant-ui组件调用Dialog弹窗异步关闭操作
- php ping主机名,PHP PING值函数
- java如何记录查看记录_Java如何检查消息是否可记录?
- oracle9i新建数据库的用户有哪些,Oracle 9i数据库的用户创造以及权限分配