首先完全背包问题需要01背包问题做铺垫,如果读者01背包问题没有解决,一定要理解之后,在看完全背包问题,包括01背包的优化!
这里是01背包
这里是01背包的全部优化

好,我们开始完全背包!

完全背包定义

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

从定义中可以看出,与01背包的区别01背包最多只能拿一件物品,完全背包则不然,只要空间够多,一种物品我可以拿n件!

01背包的状态转移方程为:dp(i,j)=max(dp(i-1,j),dp(i-1,j-v[i])+val[i])
完全背包的状态转移方程:dp(i,j)=max(dp(i-1,j),dp(i,j-v)+val[i])

我们可以看出,完全背包的动态转移方程max中第二项为i,而不是i-1。

为什么呢?

我们用01背包的思想去推导,完全背包的动态转移方程

完全背包状态转移方程推导

首先完全背包问题的动态转移方程可写为
(w为val[i]简写)(v=v[i]简写)

dp(i,j)=max(dp(i-1,j) , dp(i-1,j-v)+w , dp(i-1,j-2v)+2w , dp(i-1,j-3v)+3w,
~~(以此类推到k) ,dp(i-1,j-k*v+kw))

我简单解释一下上面的方程,其实就是利用01背包思想,要求无限个物品,实际上我最多能装V/v[i]个 (总体积除以的单个个体积),所以我从装0个,到装一个,2个,3个,k个这里面一定有其中一个,是能产生最大的价值!

然后我们利用上述公式推导出"完全背包的状态转移方程"

开始推导
(时刻注意与这个方程的联系)

dp(i,j)=max(dp(i-1,j) , dp(i-1,j-v)+w , dp(i-1,j-2v)+2w , dp(i-1,j-3v)+3w,
~~(以此类推到k) ,dp(i-1,j-k*v+kw))

推导开始

还是利用01背包思想
dp(i,j-v)=max( dp(i-1,j-v) , dp(i-1,j-2v)+w,dp(i-1,j-3v)+2w , dp(i-1,j-4v)+3w,~~
~依次类推到k , dp(i-1,j-kv)+(k-1)w) )

我们在这个方程两侧同时加上w,即可得到

dp(i,j-v)+w=max( dp(i-1,j-v)+w , dp(i-1,j-2v)+2w,dp(i-1,j-3v)+3w , dp(i-1,j-4v)+4w,~~dp(i-1,j-kv)+kw)

我们在回顾一下这个方程

dp(i,j)=max(dp(i-1,j) , dp(i-1,j-v)+w , dp(i-1,j-2v)+2w , dp(i-1,j-3v)+3w,
~~(以此类推到k) dp(i-1,j-k*v)+kw))

可以发现dp(i,j-v)+w可以替代

dp(i-1,j-v)+w , dp(i-1,j-2v)+2w , dp(i-1,j-3v)+3w,~~, dp(i-1,j-k*v)+kw

所以我们得出
完全背包的状态转移方程:dp(i,j)=max(dp(i-1,j),dp(i,j-v)+w)

好了我们推导完成。
然后我们看下代码:

#include <iostream>
using namespace std;int N,V;
int v[1010],val[1010];
int dp[1010][1010];
int main()
{scanf("%d%d",&N,&V);for(int i=1; i<=N; i++){scanf("%d%d",&v[i],&val[i]);}for(int i=1; i<=N; i++)for(int j=0; j<=V; j++){dp[i][j]=dp[i-1][j];//继承上一个背包if(j>=v[i]){  //完全背包状态转移方程dp[i][j]=max(dp[i-1][j],dp[i][j-v[i]]+val[i]);}}printf("%d",dp[N][V]);return 0;
}

从宏观上理解,为什么会这样呢?

我从代码的角度阐释一下这个问题!
注意我们现在并没有对dp数组进行降维!
我们的j是从0开始的,依次递增这个是完全背包的关键,也是与01背包本质的区别
dp[i][j]=max(dp[i-1][j],dp[i][j-v[i]]+val[i]);
首先要满足完全背包的动态转移方程,就要先知道dp(i,j-v)的大小
正好我们是从0开始的,并不是从后往前,也就是当求到dp(i,j)时
dp(i,j-v),在前面已经求过!!!
所以我们可以应当理顺的求出dp(i,j)而不再是向01背包要考虑前i-1时候的状态!

完全背包的优化

然后我们根据01背包的优化原则对,完全背包进行优化!
优化后的动态方程
dp[j]=max(dp[j],dp[j-v]+w)

代码(里面有一个点需要理解,我写在注释里了)

#include <iostream>
using namespace std;int N,V;
int v[1010],val[1010];
int dp[1010];
int main()
{scanf("%d%d",&N,&V);for(int i=1; i<=N; i++){scanf("%d%d",&v[i],&val[i]);}for(int i=1; i<=N; i++)for(int j=0; j<=V; j++){dp[j]=dp[j];//此时右边的dp[j]是上一层i-1的dp[j],然后赋值给了当前i的dp[i]if(j>=v[i]){dp[j]=max(dp[j],dp[j-v[i]]+val[i]);//dp[j-v[i]],已经被算过}           }printf("%d",dp[V]);//输出最大体积,即最优解return 0;
}

感谢观看,希望大家多多支持一键三连!!
嘻嘻~~

完全背包问题(详细解答)相关推荐

  1. C语言动态规划法解决0/1背包问题(详细解答)

    动态规划法解决0/1背包问题(详细解答) 首先让我们回顾一下动态规划法的使用规则: 一..动态规划法的实现思路: 1.划分子问题:将元问题分解为若干个子问题,每一个子问题对应一个决策,并且子问题之间具 ...

  2. 背包算法(一)-01背包-史上最详细解答

    背包算法(一)-01背包-史上最详细解答 1. 题目 2. 分析 2.1 状态表示 2.2 状态计算 3. 实现 4. 优化 5. 测试 1. 题目 问题描述:有n件物品和容量为m的背包,给出i件物品 ...

  3. pandas.get_dummies函数用法详细解答(实践)

    pandas.get_dummies函数用法详细解答(实践) pandas.get_dummies函数用法详细解答(实践)_skywf的博客-CSDN博客 one-hot encoding one-h ...

  4. 校招社招必备核心前端面试问题与详细解答

    本文总结了前端老司机经常问题的一些问题并结合个人总结给出了比较详尽的答案.网易阿里腾讯校招社招必备知识点. 原理讲解参考:前端增长-重新定义大前端 在线课程:网易云课堂课程      思否课堂 官方博 ...

  5. 2021年 第13届 全国大学生数学竞赛 初赛(非数学类)试题详细解答

    [2020年第12届全国大学生数学竞赛--资源分享 ][1~11届省赛决赛考题及题解(数学类.非数学类).推荐学习网址.复习备考书籍推荐] 2019年 第11届 全国大学生数学竞赛 初赛(非数学类)试 ...

  6. c语言加法结合性,C语言 运算符 的结合性 怎么理解?求举例子详细解答!!

    C语言 运算符 的结合性 怎么理解?求举例子详细解答!! 关注:284  答案:5  信息版本:手机版 解决时间 2019-01-11 21:03 战魂 2019-01-11 10:01 C语言 运算 ...

  7. Linux 170个常见问题的详细解答

    Linux 170个常见问题的详细解答   <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:offi ...

  8. 操作系统课设详细解答

    操作系统课设详细解答 一.题目一 实验一 Windows 进程管理 二.实验目的 (1)学会使用 VC 编写基本的 Win32 Consol Application(控制台应用程序). (2)通过创建 ...

  9. 「 最新大厂常考架构技术面试题 + 详细解答」

    很多没有收到offer的朋友一直在 后台问我,怎么梳理面试要考的知识点.这里必须要和大家再强调一下要准备的7大方面!总结起来包括:JAVA编程语言+数据结构和算法题+计网+操作系统+设计模式+数据库+ ...

  10. 【机试题】2014大疆嵌入式笔试题(附超详细解答,下篇)

    上一篇主要是对<2014大疆嵌入式笔试题>的前一部分进行了解答,本文主要是对接下来的几道题进行解答.想要参考上一篇的点击链接:[机试题]2014大疆嵌入式笔试题(附超详细解答,上篇). 嵌 ...

最新文章

  1. java中的多对多关系解析_Java中多对多映射关系(转)
  2. JAVA中在switch语句里使用枚举
  3. android 资源文件
  4. python逻辑运算优先级_测试误区《二》 python逻辑运算和关系运算优先级
  5. android音乐播放器歌词乱码,手机听歌显示乱码 没歌词 教你如何一键解决
  6. 那个直播软件有软件测试课程,资讯详情-直播软件有哪些测试方法-柠檬班-自动化测试-软件测试培训-自学官网...
  7. 大数据服务模型设计:默默无闻的贤内助
  8. Centos6.8下安装Mysql5.6.14,连接mysql及增删改查,通过Mysql-Front远程连接(开启端口、允许远程连接)
  9. 美国大学生数学建模竞赛获奖经验贴
  10. 网络 | 1.OSI七层模型各层常见协议
  11. apache2.2配置https协议(key文件、crt文件、csr文件生成方法)
  12. pycharm查找替换快捷键
  13. “傻瓜化”设计 甲骨文数据库机90分钟完成部署
  14. 什么是DDOS流量攻击,DDoS防护手段
  15. Python-字典学习
  16. 一篇文章轻松学会python装饰器
  17. 在网页上加QQ,MSN,skype,goolge TALK,雅虎通,贸易通,淘宝旺旺在线客服代码
  18. MATLAB自编自适应中值滤波算法
  19. 【iOS逆向】iOS越狱流程和越狱查看其它APP的UI层级Reveal的使用全流程
  20. 零基础学python需要多长时间,一篇文章给你讲清楚?

热门文章

  1. Cain嗅探工具的DNS欺骗
  2. JAVA代码翻译更新(第五篇)
  3. 华为荣耀6 root
  4. Apollo学习笔记(6)module control
  5. css定义文字加粗,css文字加粗font-weight
  6. OFBiz财务模型-金融账户
  7. 第十节 直流变直流电路(DCDC)芯片选型
  8. cdrx4自动排版步骤_教你用CorelDRAW X4轻松排出干净整齐段落
  9. 企鹅智库:2019-2020中国互联网趋势报告
  10. 偏最小二乘回归(PLSR)算法原理