有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. linux 系统中用root切换到普通用户时显示的异常如-bash-4.1$
  2. USACO1.1 Broken Necklace (beads)
  3. Python 进阶_OOP 面向对象编程_组合与继承
  4. javascript json_爬虫里总要用到的 JSON 是什么?
  5. 聚美优品范忱:我是如何将用户推荐准确率提升 10% 的?
  6. 完美解决Ubuntu16.04虚拟机窗口自适应问题
  7. avr-gcc中关于delay延时函数的应用修改版[ourdev]
  8. 小黄鸡 php,PHP调用小黄鸡 api post发送
  9. 卢伟冰:越是入门机 越应该把使用体验做好
  10. Thymeleaf本页面通过controller跳转到本页面的坑
  11. 8.22最短路径讲解
  12. 勤哲excel服务器点击修改,用勤哲Excel服务器实现工作任务管理系统
  13. 理解拉普拉斯平滑 Laplace Smoothing
  14. Xshell6和Xftp6的使用
  15. win10怎么修改计算机用户名和密码,windows10系统如何更改开机密码
  16. 中国科学院计算机所研究生实习,我在中科院计算所实习的日子(更新中....)...
  17. css3探测光圈_纯CSS3实现的镜头光晕(光圈)
  18. The OCD Brain: how animal research helps us understand a devastating condition
  19. css立体3d效果动画,css3 实现动画,变换基点及3D效果~
  20. windows重要信息(键盘、鼠标、计时器)

热门文章

  1. python识别人脸多种属性_OpenCV-Python(3)训练一个人脸识别器
  2. python 按从小到大的顺序组合成一个字典_将Python字典排列组合成字典列表
  3. python学习-模块和包
  4. java后台http请求完成之后怎么setcookie_关于HTTP的那些事和cookie
  5. reg类型变量综合电路_2014年PLD习题集(含参考答案)数字系统设计
  6. python一维列表的定义_数据结构-Python 列表(List)
  7. shell python脚本语言_python脚本里使用shell语句
  8. vivadoRAM中初始化文件coe如何快速生成
  9. mysql基础_月隐学python第22课
  10. zabbix-server-mysql安装_zabbix server 安装部署