上一篇我们学习了什么是动态规划问题和什么是背包问题,并且分析了01背包,如果想看上一篇请转移至–>背包问题之01背包详解,今天我们来了解一下背包问题之完全背包问题.

文章目录

  • 一、什么是完全背包问题?
  • 二、例题分析
    • 1. 题目:
    • 2. 分析:
      • 2.1 第一步:确定状态变量(函数)
      • 2.2 第二步:确定状态转移方程
      • 2.3 边界条件
    • 3. 过程表示
      • 3.1 核心代码
      • 3.2 手动计算
      • 3.3 代码验证
      • 3.4 完整代码
      • 3.5 优化

一、什么是完全背包问题?

有n种物品,每种物品的单件体积为v[i],价值为w[i]。现有一个容量为V的背包,问如何选取物品放入背包,使得背包内物品的总价值最大。其中每种物品都有无穷件。
完全背包和01背包的区别:

  1. 01背包在选择某一个物品时只有不选和选一次两种情况
  2. 完全背包在选择某一个物品时可以不选,也可以选一次,选两次。。。选择次数没有上限(只要背包能放下)

二、例题分析

1. 题目:

2. 分析:

2.1 第一步:确定状态变量(函数)

最大价值是物品数量i和背包容量j的函数。
设函数f[i][j]表示前i件物品放入容量为j的背包的最大价值。
最终的最大价值就是物品数量i从0增长到n,背包容量j从0增长到m时的f[n][m]值。

2.2 第二步:确定状态转移方程

状态变量:f[i][j]表示前i件物品放入容量为j的背包的最大价值

当前容量为j,我们要考虑第i件物品能否放入?是否放入?

  1. 如果当前背包容量j<v[i],不能放入,则f[i][j]=f[i-1][j]
  2. 如果当前背包容量j>=v[i],能放入但是要比较代价
    2.1 如果第i件物品不放入背包,则f[i][j]=f[i-1][j]
    2.2 如果第i件物品放入背包,则f[i][j]=f[i][j-v[i]]+w[i]

对于前i件物品,背包容量为j-v[i]时可能已经放入了第i件物品,容量为j时还可以再放入第i件物品,所以用f[i][j-v[i]]更新f[i][j]

状态转移方程:

可以画图表示为:

2.3 边界条件

对于01背包来说边界就是f[i][j]=0,即当i=0或者j=0时f[i][j]的值为0。

i=0时,表示背包没有放入一个物品,那么此时背包的最大价值无从谈起,所以为0;
j=0时,表示背包的容量为0,那么此时无法放入物品,所以最大价值也为0;

3. 过程表示

3.1 核心代码

    for(int i=1;i<=n;i++){//物品ifor(int j=0;j<=m;j++){if(j<v[i])f[i][j]=f[i-1][j];elsef[i][j]=max(f[i-1][j],f[i][j-v[i]]+w[i]);}}cout<<f[n][m]<<endl;

3.2 手动计算

3.3 代码验证

3.4 完整代码

#include<iostream>
#include<algorithm>
using namespace std;const int N=1010;
int n,m;
int v[N],w[N];
int f[N][N];
int main ()
{cin>>n>>m;for(int i=1;i<=n;i++) cin>>v[i]>>w[i];for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){if(j<v[i])f[i][j]=f[i-1][j];elsef[i][j]=max(f[i-1][j],f[i][j-v[i]]+w[i]);}cout<<f[n][m]<<endl;return 0;
}

3.5 优化

将二维表示优化成一维,减少空间的使用,用一维数组f[j]只记录一行数据,让j值顺序循环,顺序更新f[j]
优化后的代码

#include<iostream>
#include<algorithm>
using namespace std;const int N=1010;
int n,m;
int v[N],w[N];
int f[N];
int main ()
{cin>>n>>m;for(int i=1;i<=n;i++) cin>>v[i]>>w[i];for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){if(j<v[i])f[j]=f[j];elsef[j]=max(f[j],f[j-v[i]]+w[i]);}cout<<f[m]<<endl;return 0;
}

因为j是顺序循环,f[j-v[i]]会先于f[j]更新,也就是说,用新值f[j-v[i]]去更新f[j],相当于用第i行的f[j-v[i]]值更新f[j],所以正确。

动态规划背包问题之完全背包详解相关推荐

  1. 动态规划背包问题之多重背包详解

    背包问题前几篇文章: 01背包详解 完全背包详解 文章目录 一.什么是多重背包问题? 二.例题分析 1. 题目: 2.第一种:朴素做法 3.第二种:二进制优化 4.第二种:单调队列优化<待写&g ...

  2. 动态规划背包问题之01背包详解

    文章目录 一.问题引入 1.什么是动态规划? 2.什么是背包问题? 3.什么是01背包? 4.背包问题怎么做? 二.例题讲解 1.题目: 2.分析 2.1 第一步:状态表示 2.2 第二步:确定状态转 ...

  3. 动态规划 背包问题小结 0-1背包(采药 九度第101题) 完全背包(Piggy-Bank POJ 1384) 多重背包(珍惜现在,感恩生活 九度第103题)

    本小结介绍0-1背包.完全背包以及多重背包问题 记忆要点: 0-1背包:二维数组情况下,顺序遍历体积或者倒序均可以                降维情况下需倒序遍历体积 完全背包:数组降维+顺序遍历 ...

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

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

  5. 各种背包详解(自己总结) 金明的预算和LOL(可依赖的背包问题)

    在讲可依赖背包之前先回顾下背包九讲的内容,现在做dp多了发现背包问题真的是dp的鼻祖,好多种问题都是基于背包的模型发展而来,就是不是基于背包的,把背包搞懂也有利于你自己学习dp,以此来想到其它状态转移 ...

  6. 动态规划 —— 背包问题 P02 —— 完全背包

    [概述] 完全背包问题也是一个相当基础的背包问题,它有两个状态转移方程,分别在"基本思路"以及"O(VN)的算法"的小节中给出. [题目] 有N种物品和一个容量 ...

  7. 动态规划 —— 背包问题 P01 —— 0-1背包

    [概述] 0-1背包问题是最基本的背包问题,它包含了背包问题中设计状态.方程的最基本思想,另外,别的类型的背包问题往往也可以转换成0-1背包问题求解. 特点:每种物品仅有一件,可以选择放或不放. [题 ...

  8. 古有陈天华万字血书抗沙俄,今有本剧蒻万字背包虐dp(01,完全,多重,分组,混合等各种背包详解 + 板子题+ 奇奇怪怪滴变式题)

    前言: 本文介绍了01背包.完全背包.多重背包.混合背包.分组背包等背包,并对其进行透彻的剖析,并附上了板子题,供您白嫖,以及一些奇葩变式,颇有意思,供你琢磨玩弄.此外绝大部分题都有二维数组和滚动数组 ...

  9. 动态规划从入门到提升详解

    写在开头: 这篇博客将从最开始入门到提升,说明关于如何学习动态规划,适合小白以及学过想要提高的选手,篇幅可能较长持续更新,主要是为了带学弟学妹以及自己复习而写. 由于时间和篇幅等问题,一些基础的东西将 ...

  10. 0x54. 动态规划 - 树形DP(习题详解 × 12)

    目录 0x54.1 树形DP Problem A. 没有上司的舞会 Problem B. 战略游戏 0x54.2 树上背包 Problem A. 选课 Problem B.[数据加强版]选课(树上背包 ...

最新文章

  1. 一个线程罢工的诡异事件
  2. JAVA实现简单链表操作
  3. 随笔18 java中的类加载器
  4. sklearn常见命令和官方文档汇总
  5. [转贴]ATOM和RSS的区别
  6. java中怎样创建线程_java中的线程创建和使用
  7. pycharm Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon run
  8. 第一次点击button, view视图出现;第二次点击button,view视图消失
  9. 游戏迷看过来 年末促销买个华为平板 M3可畅玩
  10. 计算机辅助翻译软件差异,两款计算机辅助翻译软件的比较
  11. 24种不同的ITF条形码字体版本的条形码控件Interleaved 2 of 5 Barcode Font Advantage Package...
  12. win7系统计算机怎么更改密码,Win7系统怎么设置和删除电脑开机密码?
  13. CVPR2021 视频目标检测论文推荐
  14. android 方法映射,高通Android平台驱动层 MSM8916 键值映射方法
  15. canvas SVG webGL比较
  16. qt 判断ctrl键被按下_直播 | 当世界被按下暂停键,幸有阅读可慰藉
  17. 2021年小目标检测最新研究综述 很全面值得收藏
  18. 测试 | 让每一粒尘埃有的放矢
  19. SKY19225-001单刀四掷(SP4T)开关设计
  20. 产品经理遇到瓶颈,如何突破?硅谷产品教父Marty Cagan 告诉你

热门文章

  1. 分支定界法解TSP问题(one-tree算法定界)附java代码
  2. 简单的在线出入库管理用哪个系统好
  3. EPLAN教程——如何手动放置报表(以端子排为例)
  4. Ant Design 框架
  5. XUI框架之FlowTagLayout流标签的使用,实现原生android没有的功能?
  6. 模拟实现一个银行的取号机
  7. 菏泽话务员机器人方案_AI人工智能语音系统电话机器人
  8. 摄像头网络模组的使用
  9. 乐高叉车wedo教案_乐高wedo20课程教案
  10. 本周大新闻|传Cambria采用升级版XR2芯片,TGS增设VR虚拟展厅