有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

View Code

#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背包的方法:

View Code

#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

背包学习————完全背包相关推荐

  1. 背包问题教程-01背包,完全背包,多重背包,混合背包 收藏

    P01: 01背包问题 题目 有N件物品和一个容量为V的背包.第i件物品的费用是c[i],价值是w[i].求解将哪些物品装入背包可使价值总和最大. 基本思路 这是最基础的背包问题,特点是:每种物品仅有 ...

  2. 01背包和完全背包 的完整讲解版 包含 一维数组实现 和二维数组实现题目

    (二)01背包和完全背包 的完整讲解版 包含 一维数组实现 和二维数组实现题目 //有N件物品和一个容量为V的背包.第i件物品的体积是c[i],价值是w[i].求解将哪些物品装入背包可使价值总和最大. ...

  3. 2022年小游戏----游戏背包系统之自定义填充背包和切换背包页面

    文章目录 蓝图展示 UI_Main_Bag蓝图 UI_Main_Bag_Item蓝图 创建数据结构和数据表 创建数据结构 引用结构创建数据表 编辑UI_Main_Bag_Item图表 使用标签获取数据 ...

  4. 动态规划dp(带模板题の超易懂版):01背包,完全背包,分组背包,多重背包,混合背包

    动态规划dp(带模板题の超易懂版):01背包,完全背包,分组背包,多重背包 01背包 && 完全背包 && 分组背包 の 视频教程:https://www.bilibi ...

  5. 01背包,完全背包C++实现

    首先,上自己的代码,由于代码注释详细,我就不解释啦.看代码就好O(∩_∩)O. 代码转换为了01背包问题求解. 代码部分算法与测验数据数据参照了https://blog.csdn.net/xp7315 ...

  6. 背包详解:完全背包与多重背包

    目录 完全背包 优化一:输入优化 优化二:二进制 优化三:重复放入的 01 背包 多重背包 总结 完全背包 有一个大小为 m 的背包,有 N 种物体,每种物品的价值为 Vi, 大小为 Ai, 并且每种 ...

  7. 浅说——九讲背包之01背包

    所谓九讲,也就是: 0/1背包 0/1背包降维 完全背包 多重背包(二进制优化) 混合背包 二维费用背包 分组背包 有依赖的背包 背包的方案总数\背包的具体方案路径 0/1背包: [问题描述](经典) ...

  8. hdu 3732(01背包转多重背包)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3732 思路:这么大的数据,用01背包肯定会TLE的,01背包转多重背包..最多也就11*11=121件 ...

  9. 动态规划 4、基础背包问题总结(多重背包与多重背包的转化)

    描述: 有N种物品和一个容量为V的背包.第i种物品最多有n[i]件可用,每件费用是c[i],价值是w[i].求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大. 变式:有的物品 ...

最新文章

  1. Microbiome:芝麻菜中肠杆菌科主导核心微生物组并贡献抗生素抗性组
  2. 通俗易懂理解GBDT算法原理-转
  3. 是固执成见还是步步为营,工程建筑行业如何追赶人工智能化潮流?
  4. archlinux 安装 Windows 字体
  5. 无法打开 configsource 文件
  6. 差生的底线和所谓的坚持不过是一个笑话
  7. 2018成都初二计算机会考时间,2018年四川学业水平考试时间及科目
  8. opencv学习笔记22:傅里叶变换,高通滤波,低通滤波
  9. Java方法中的参数太多,第8部分:工具
  10. html 盒子重叠,CSS3 box-shadow用于重叠的div
  11. signature=c0c1b69f720d190a4a817d6bf2ff57c3,Fungicidal substituted N-(1-iodopropargyl)thiazolidinones
  12. 提交数据网页设计_网站网页编写需要注意哪些问题?
  13. script脚本中写不写$(document).ready(function() {});的差别
  14. NWA Quality Analyst应用案例:在食品加工中选择和实施SPC软件
  15. 最新win10系统下载64位
  16. 如何使用谷歌搜索API来获取结果
  17. 计算机图标下面有颜色,小编教你电脑桌面图标有蓝色阴影怎么去掉
  18. Django 开发微信公众号
  19. postman 9.16 打不开怎么办
  20. python的字典-使用字典+遍历字典+字典嵌套

热门文章

  1. python random 和numpy random_Python中numpy.random和random.random之间的区别
  2. 电脑上怎么做pdf文件_PDF压缩文件怎么压缩最小?请收好这些PDF压缩方法
  3. linux 使用nginx 权限不够,对于nginx和Linux,有一些关于权限的问题。
  4. mysql proxy 管理_ProxyMySQL的Admin管理接口
  5. java methodtype_java基于MethodHandle调用方法
  6. linux中firefox替换,Ubuntu更换Firefox版本的方法
  7. loading怎么关闭 vant_vant-ui组件调用Dialog弹窗异步关闭操作
  8. php ping主机名,PHP PING值函数
  9. java如何记录查看记录_Java如何检查消息是否可记录?
  10. oracle9i新建数据库的用户有哪些,Oracle 9i数据库的用户创造以及权限分配