完全背包问题:n种物品,每一件的物品重量为 w[ i ],价值为 c[ i ]。现有一个容量为V的背包 (背包的最大承重为V),问如何选取物品放入背包,使得背包内物品的总价值最大,最大为多少?(每一种物品均有无穷件)


完全背包与01背包的区别 

完全背包与 背包DP | 01背包问题 的唯一区别就在于:01背包问题每一种物品只有一件,你只能选择0件或1件。而完全背包问题每一种物品有无穷件,对于同一种物品你可以同时选取1件、2件...只要不超过容量V即可。


1、算法分析

dp[ i ] [ j ] 表示在前 i 种物品中选取部分物品,能放入背包容量为 j (可以不装满)的最大价值(最优解)。其中。那么如何求解最优解呢?下面考虑对第 i 种物品的选择策略:

情况1:j < w[ i ]

  • 不可能放入放第 i 种物品:那么问题就转化为前 i - 1 件物品恰好装入背包容量为 j 的最优解

情况2: j >= w[ i ]

  • 不放第 i 种物品:那么问题就转化为 前 i - 1种物品恰好装入背包容量为 j 的最优解
  • 放第 i 种物品:那么问题就转化为为 前 i 种物品恰好装入背包容量为 j - w[ i ] 的最优解 + c[ i ]

(注意:这里选择放入第 i 种物品的选择之前,可能也是放入了第 i 种物品的!)

状态转移方程如下:

当 i = 0 或 j = 0(边界条件) :
当 

最终答案就储存在 dp[n][V] 中


2、过程示例

对于n = 5, V = 10 的情况 :


3、代码实现

#include <algorithm>
#include <cstdio>using namespace std;
#define MAXN 100
#define MAXV 100/* 完全背包问题:有n种物品,每一件的物品重量为 w[ i ],价值为 c[ i ]。* 现有一个容量为V的背包 (背包的最大承重为V),问如何选取物品放入背包,* 使得背包内物品的总价值最大,最大为多少?(每一种物品均有无穷件) */int fun(int n, int v, int w[], int c[]) {int dp[MAXN][MAXV] = {0};for (int i = 1; i <= n; i++)  //i为当前可选物品for (int j = 1; j <= v; j++) {  //j为最大容量if (w[i] > j)dp[i][j] = dp[i - 1][j];elsedp[i][j] = max(dp[i - 1][j], dp[i][j - w[i]] + c[i]);}return dp[n][v];
}


有任何问题欢迎评论交流,如果本文对您有帮助不妨点点赞,嘻嘻~ 


end

欢迎关注个人公众号 鸡翅编程 ”,这里是认真且乖巧的码农一枚。

---- 做最乖巧的博客er,做最扎实的程序员 ----

旨在用心写好每一篇文章,平常会把笔记汇总成推送更新~

背包DP | 完全背包问题相关推荐

  1. 背包DP | 01背包问题

    01背包问题:有n件物品,每一件物品的重量为 w[ i ],价值为 c[ i ].现有一个容量为V的背包 (背包的最大承重为V),问如何选取物品放入背包,使得背包内物品的总价值最大,最大为多少? 如果 ...

  2. 背包DP | 找零钱问题

    找零钱问题:假设有一个出纳员手中有几种面值的硬币,要求他用最少的硬币数支付规定的现金.例如,现有3种硬币:它们的面值分别为1元.4元和6元.要支付8元. 找零钱问题可以使用贪心或完全背包来解决,但是用 ...

  3. 背包dp的核心思想(动态规划)

    背包dp 突然发现我一直没有真正理解背包,真正的背包应该是用空间换时间的一种dp方法,本质上就是n个物品选或不选,理论上有2n2^n2n种可能结果,但是背包利用的就是值域很小这一特点来重叠子结构,所以 ...

  4. 【bzoj4007】[JLOI2015]战争调度 暴力+树形背包dp

    题目描述 给你一棵 $n$ 层的完全二叉树,每个节点可以染黑白两种颜色.对于每个叶子节点及其某个祖先节点,如果它们均为黑色则有一个贡献值,如果均为白色则有另一个贡献值.要求黑色的叶子节点数目不超过 $ ...

  5. 【bzoj4753】[Jsoi2016]最佳团体 分数规划+树形背包dp

    题目描述 JSOI信息学代表队一共有N名候选人,这些候选人从1到N编号.方便起见,JYY的编号是0号.每个候选人都由一位编号比他小的候选人Ri推荐.如果Ri=0则说明这个候选人是JYY自己看上的.为了 ...

  6. 01背包、完全背包、多重背包问题的C++实现及路径记录

    这里主要实现路径记录,只求最值问题移步 01背包.完全背包.多重背包问题的C++实现 以下均打印输出路径,即装入背包的物品序号,和最大值. 01背包问题 #include <iostream&g ...

  7. (背包dp) 背包N讲

    文章目录 前言 相关练习题 模板题 01背包 完全背包 多重背包 小数据范围 (可朴素暴力) 中等数据范围 (二进制优化) 大数据范围 (单调队列优化) 混合背包 二维费用背包 分组背包 有依赖的背包 ...

  8. HDU-4044 树形背包dp好题

    不会做,题解是参考网上的.感觉这道题是到好题,使得我对树形背包dp更了解了. 有几个注意的点,直接给出代码,题解以及注意点都在注释里了. #include<bits/stdc++.h> u ...

  9. python多重背包_多重背包问题(python实现),动态规划

    多重背包问题 感谢这些朋友们的文章,给了我很大启发: https://blog.csdn.net/songyunli1111/article/details/94778914 https://blog ...

最新文章

  1. Kong APIGW — Plugins — Traffic Control
  2. 一些恶心的代码片段,你看了就知道!
  3. Java进阶:@CallerSensitive详解
  4. 北斗导航 | RAIM:单差载波相位完好性监测(接收机自主完好性检测)
  5. Spring 基础技术点
  6. 为什么使用getrequestdispatcher跳转出现404_网站出现404错误时的处理方法
  7. c++实现数值的整数次方(类似pow())作用
  8. 用Arcgis把离散的点画出等值线和等值面(色斑图)
  9. 怎样做出优秀的扁平化设计风格 PPT 或 Keynote 幻灯片演示文稿?(装)
  10. Hibernate下载地址
  11. 软件项目活动图 关键路径
  12. UA MATH564 概率论 概率不等式
  13. 英国易捷航空遭黑客入侵 约900万客户数据被窃取
  14. MUD教程--巫师入门教程3
  15. 基于RFM模型的用户价值分析——PythonTableau
  16. 开发用台式机还是笔记本_您应该开发台式机还是Web应用程序?
  17. 分别使用liunx,windows命令和android代码,快速生成facebook密钥散列
  18. 请问,你心里有B树吗??(B树添加、删除操作详细图解)
  19. 父母不会用手机 App?中老年群体的app应用产品
  20. 基于Nibiru的安卓AR开发教程

热门文章

  1. 构建高性能的微博系统——再谈新浪微博架构
  2. 鸿蒙麒麟安卓骁龙IOS,华为用户“福利”!这10款麒麟芯片手机,能升级鸿蒙OS3.0!...
  3. 《ACM算法详解》— 求素数(质数)算法
  4. ESP8266_RTOS_SDK学习笔记之 FreeRTOS移植浅析
  5. 你若懂我,该有多好(莫言)
  6. 涅槃重生,BitKeep如何闯出千万用户新起点
  7. 苹果付费分享《十三煞》
  8. vue拖拽排序(原创组件)
  9. mysql开放允许外部连接_设置MySql允许外部连接的方法
  10. Linux c语言sleep多线程while循环实验