先回顾一下先前讨论过的0-1背包问题,每个物品最多只能选择一次或者选择不选择。

令人头疼的背包九讲(1)0/1背包问题

而在完全背包问题中,每件物品可以被选择无限次

完全背包问题

有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。每种物品都有无限件可用。 求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。

输入格式
第一行两个整数,N,M空格隔开,分别表示物品数量和背包容积。

接下来有N行,每行两个整数vi,wi,空格隔开,分别表示第i件物品的体积和价格

输出格式
输出一个整数,表示最大价值。

数据范围
0<N,M<1000

0<vi,wi<1000

解题

这道题目我想用二维数组的方式去解决,然后再拓展到一维数组上。

首先我们先建立一个f数组,开辟为f[N+1][M+1].特别地,f[i][j]代表第i个物品下容量为j的最大价值。

那么我们思考一下从当前物品只能选0/1次当前物品可以选无数次的差别

物品只能选0/1次

当物品只能0/1时
1.当j>=当前物品的体积W时,我可以选也可以不选,取最优结果

f[i][j]=Math.max(f[i-1][j-W]+V,f[i][j])

2.当j<当前物品的体积W时,我只能不选,因为我装不下

f[i][j]=f[i-1][j]

物品能选无限次

1.当j>=当前物品的体积W时,我可以选也可以不选,取最优结果

此时要注意的是我的状态方程变换成了这个

f[i][j]=Math.max(f[i][j-W]+V,f[i][j])
// 0/1问题下是f[i][j]=Math.max(f[i-1][j-W]+V,f[i-1][j])

这也是迷惑大家很久的一个点,物品还是那个物品,怎么次数还改变了它的状态方程?

我们从逻辑角度来推理一下

0/1问题中f[i][j]代表当前我选到第i个物品j容量下能够取到的最大价值,当前选取物品是由上一个物品的最大价值转移过来的,当我要放下这个物品时,肯定是要把上一个物品的状态作为参考系进行计算。

完全背包问题中,f[i][j]代表的也是我选到第i个物品j容量下能够取到的最大价值,但是由于我可以选择很多件物品,所以将上一个物品的最大值作为参考系,那就回到了0/1问题。

怎么办?

把参考系变成当前物品即可,因为当我们的参考系是当前物品的时候,就可以选取无限个物品了

f[i][j]=Math.max(f[i][j-W]+V,f[i-1][j])

f[i][j-W]+v 代表我在第i个物品,且容量为j-W的基础上,再次选择了这个物品

f[i-1][j] 代表我不选择这个物品

2.当j<当前物品的体积W时,我只能不选,因为我装不下

f[i][j]=f[i-1][j]

如果是使用一维数组怎么解决?

在一维数组的基础上,相当于把物品的状态给压缩了,f[j]代表j容量下能够取到的最大价值。

在0/1背包问题中,这个状态方程由

for(int i=1;i<=N;i++){for(int j=1;j<=M;j++){if(j>=W)  f[i][j]=Math.max(f[i-1][j-W]+V,f[i-1][j]);elsef[i][j]=f[i-1][j];}
}

转换成了

for(int i=1;i<=N;i++){for(int j=M;j>=1;j--){//容量从大到小遍历,0/1问题if(j>=W)  f[j] = Math.max(f[j-W]+V,f[j]);elsef[j] = f[j];}
}

在完全背包问题中,这个状态方程由

for(int i=1;i<=N;i++){for(int j=1;j<=M;j++){if(j>=W)  f[i][j]=Math.max(f[i][j-W]+V,f[i-1][j]);elsef[i][j]=f[i-1][j];}
}

变成了

for(int i=1;i<=N;i++){for(int j=1;j<=M;j++){//容量从小到大遍历,完全背包问题if(j>=W)  f[j] = Math.max(f[j-W]+V,f[j]);elsef[j] = f[j];}
}

和Jerry哥聊技术,聊生活

令人头疼的背包问题 - 完全背包问题相关推荐

  1. 经典背包问题3——背包问题求方案数 、背包问题求具体方案

    经典背包问题3--背包问题求方案数 .背包问题求具体方案 1. 背包问题求方案数 2. 背包问题求具体方案 1. 背包问题求方案数 有 N 件物品和一个容量是 V的背包.每件物品只能使用一次. 第 i ...

  2. 0-1背包问题和背包问题

    (1)0-1背包问题 0-1背包问题可做如下描述: 给定n种物品和一个背包,每个物品有一个[wi,vi]对,表示其重量和价值.背包的总容量为C.对于每个物品,要么装要么不装(0或1),现在需要设计方案 ...

  3. 01背包问题+完全背包问题+多重背包问题

    一 01背包问题 1.1题目 有N件物品和一个容量为V 的背包.放入第i件物品耗费的空间是Ci,得到 的价值是Wi. 求解将哪些物品装入背包可使价值总和最大. 1.2 基本思路 这是最基础的背包问题, ...

  4. 动态规划 —— 背包问题 P09 —— 背包问题的变化

    [输出方案] 一般而言,背包问题是要求一个最优值,如果要求输出这个最优值的方案,可以参照一般动态规划问题输出方案的方法:记录下每个状态的最优值是由状态转移方程的哪一项推出来的,换句话说,记录下它是由哪 ...

  5. 背包问题——01背包问题——饭卡

    知识点:01背包问题 饭卡 电子科大本部食堂的饭卡有一种很诡异的设计,即在购买之前判断余额.如果购买一个商品之前,卡上的剩余金额大于或等于5元,就一定可以购买成功(即使购买后卡上余额为负),否则无法购 ...

  6. 0 1背包问题 java_0-1背包问题,java的动态规划如题,代码如下public

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 0-1背包问题,java的动态规划 如题,代码如下 public class dongtaiguihua01 { public static void m ...

  7. 完全背包问题+01背包问题+分组背包+多重背包 总结

    背包问题都涉及到动态规划,利用dp进行更加优化的计算. 一.01背包 最基本的是01背包问题,题目一般类似:"在一定数目物品内,挑选总重量不超过一定数目的物品,其中每个物品只能选一次,求背包 ...

  8. 回溯法求解背包问题java_背包问题回溯法的递归实现(java)

    0-1背包问题,在搜索过程中使用递归来完成. package com.test; class Pack { int n = 8; //物品个数 int W = 110; //背包总容量 int[] W ...

  9. 01背包问题,多重背包问题-分组背包问题-完全背包问题-总结-内含4种经典背包问题

    01背包问题: 例题:传送门 01背包问题的特点:背包容量有限,物品只有一个,具有确定的体积和价值,我们的目标就是在不超过背包最大体积的情况下装入价值尽可能大的物品,让我们输出最大总价值 对于背包问题 ...

  10. python 完全背包问题_背包问题九讲python3实现

    背包九讲是动态规划思想的经典呈现,找了许久没有完整的python3实现,趁机总结一下. 1.0-1背包问题 二维DP数组解法: # n, v分别代表物品数量,背包容积 n, v = map(int, ...

最新文章

  1. 汇编语言 第3版 王爽 检测点习题部分—答案及详细解析 检测点2.3
  2. SAP 财务会计结构
  3. Docker使用中遇到的问题
  4. 二叉树的前中后序遍历之迭代法(统一风格迭代方式)
  5. 【HDU - 5890】Eighty seven(bitset优化背包)
  6. 日冕物质抛射检测matlab,日冕图像论文,关于基于实时数据的日冕物质抛射自动检测方法相关参考文献资料-免费论文范文...
  7. JS的IE和FF兼容性问题汇总
  8. M8的USB工作模式切换工具
  9. switchhost使用记录
  10. Render to Texture(渲染到纹理)
  11. 普通用户sudo echo权限依旧写入不了文件
  12. 低功耗中的Isolation cells 和Level shifter cells
  13. 如何下载IAR历史版本
  14. NAT MASQUERADE
  15. java中BOM是什么_Java处理带BOM的文本情况是什么?
  16. 无限循环小数转化分数
  17. 计算机专业C语言复试常见问题(二)
  18. ffmpeg用drawtext filter 给视频加字幕,代码实现
  19. 简单的html登录注册页面
  20. 股票量化分析工具QTYX使用攻略——涨停数据选股(更新2.5.6)

热门文章

  1. bellman ford优先队列优化简介模板
  2. 利用NABCD模型进行竞争性需求分析
  3. c++写一个类后编译发现class重定义
  4. ASP.NET 事件(回传)机制
  5. 阿里云CDN+OSS完成图片加速
  6. (O)JS核心:call、apply和bind
  7. C/C++ 活动预处理器
  8. 队列的实现(二) 链式队列的实现
  9. bzoj 3672 利用点分治将CDQ分治推广到树型结构上
  10. 读书笔记:《知道做到》