动态规划完全背包问题主要指的是:1.给定一个容量为max_weight的背包,每一种物品的质量为weight[i],价值为value[i],且每一种物品的个数有无限个,问:如何放置可以使得背包价值最大?2.可以转换为此类问题的题目。

一 典型问题

假设有一个质量为5的背包和3种物品,且每个物品的质量都不一样,这组物品的质量和价值为weights=[1,2,3],values=[2,4,6],且每种物品数量有无数个。问:如何放入物品可以使得背包中的总价值最大?

1.1 分析

此类问题与零一背包问题相比,主要区别在于遍历顺序上面:

零一背包在遍历背包容量时,是从前往后进行遍历的,这样遍历的原因是,如果从前往后遍历的话,由于递推公式是dp[i] = max(dp[i], dp[i - weight[j]] + value[j]),由于每种物品的个数是1个,然而当前dp数组的值也会由之前的dp数组dp[i - weight[j]]决定,因此这样子可能会导致同一种物品被重复放入两次或者以上。

然而对于完全背包,由于每种物品数量有无限多个,因此,一般是从前往后遍历背包容量。

1.2 代码

/*背包的容量为max_weight,物品质量为weights,物品价值为values*/
int DP_totalbag(int max_weight, vector<int> weights, vector<int> values)
{vector<int> dp(max_weight + 1, 0);for(int i = 0;i < weight.size();i++)//遍历物品{for(int j = weight[j];j <= max_weight;j++)//遍历背包dp[j] = max(dp[j], dp[j - weight[i]] + values[i]);}return dp[max_weight];
}

二 组合问题与排列问题

由于对于完全背包问题,如果问题是背包最多能够装多少东西或者背包中价值最大为多少的问题,对于遍历顺序是先遍历背包再遍历物品还是先遍历物品再遍历背包是没有区别的。

不过,如果问题改为:1.将背包填满的物品组合数(排列顺序不一样也认为是一个组合);2.将背包填满的物品排列数 这两类问题的遍历顺序是由讲究的:

2.1 分析

对于排列问题,如果先遍历物品,再遍历背包,假设物品质量分别为weights = [1,5],则最终遍历的结果只有[1, 5]这一种排列情况,不会出现[5, 1]这种排列情况,所以,这种遍历顺序是用来计算组合数的,对于排列数的遍历顺序应该是先遍历背包再遍历物品。

2.2 代码

对于组合数问题,代码如下所示:

/*背包的容量为max_weight,物品质量为weights*/
int DP_totalbag(int max_weight, vector<int> weights)
{vector<int> dp(max_weight + 1, 0);dp[0] = 1;for(int i = 0;i < weights.size();i++)//遍历物品{for(int j = weights[i];j <= max_weight;j++)//遍历背包dp[j] += dp[j - weights[i]];}return dp[max_weight];
}

对于排列数问题,代码如下所示:

/*背包的容量为max_weight,物品质量为weights*/
int DP_totalbag(int max_weight, vector<int> weights)
{vector<int> dp(max_weight + 1, 0);dp[0] = 1;for(int i = 0;i <= max_weight;i++){for(int j = 0;j <= weights.size();j++)if(i - weights[j] >= 0) dp[i] += dp[i - weights[j]];}return dp[max_weight];
}

动态规划 之 完全背包相关推荐

  1. 【动态规划】多重背包

    问题 Q: [动态规划]多重背包 时间限制: 1 Sec  内存限制: 64 MB 提交: 112  解决: 49 [提交] [状态] [讨论版] [命题人:admin] 题目描述 张琪曼:" ...

  2. c++ 动态规划-二维背包 and 潜水员问题

    动态规划 - 二维背包 1.普通二维(费用)背包 01背包问题:给定 n 种物品和一个重量(容量)(限定条件)为 w 的背包,物品 i 的重量是 wi,其价值为 vi.(每种物品只有一个)问:如何选择 ...

  3. 算法模板:动态规划之01背包【沈七】

    算法模板:动态规划之01背包 前言 动态规划 01背包 二维背包 一维优化 经典习题 小A点菜 5 倍经验日 买干草 完结散花 参考文献 前言 唤我沈七就好啦. 动态规划 核心作用:优化 当数据范围& ...

  4. 算法-动态规划(01背包)

    最近闲来无事,学学算法. 什么是动态规划,我们要如何描述它? 动态规划算法通常基于一个递推公式及一个或多个初始状态.当前子问题的解将由上一次子问题的解推出.使用动态规划来解题只需要多项式时间复杂度,因 ...

  5. 多重背包单调队列优化思路_动态规划入门——多重背包与单调优化

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是算法与数据结构的第14篇文章,也是动态规划专题的第三篇. 在之前的文章当中,我们介绍了多重背包的二进制拆分的解法.在大多数情况下,这种 ...

  6. 动态规划问题之背包模型(18题)

    背包问题是动态规划问题的一大类型,下面我们对这个进行总结. 以 Acwing y中总结的 几个类型,我写了几个题解 应用知识点 01背包.完全背包 空间压缩的写法 多维费用的背包问题,以及状态的不同表 ...

  7. 【动态规划】01背包:P1060 开心的金明

    01背包: 容量为N,重量为v[i],价值为v[i]*w[i] [动态规划笔记]01背包问题及优化_m0_52043808的博客-CSDN博客 代码: #include<iostream> ...

  8. 动态规划——背包问题01背包

    有n件物品和一个最多能背重量为w 的背包.第i件物品的重量是weight[i],得到的价值是value[i] .每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大. 动态规划五部曲: 确定d ...

  9. 代码随想录44——动态规划:完全背包理论基础、518零钱兑换II、377组合总和IV

    文章目录 1.完全背包理论基础 2.518零钱兑换II 2.1.题目 2.2.解答 3.377组合总和IV 3.1.题目 3.2.解答 4.组合和排列问题的便利顺序 4.1.组合问题 4.2.排列问题 ...

  10. 【动态规划】0-1背包递推式的剖析(通俗易懂)

    (如有错误,恳请斧正) 递推式如下: vi是第i件物品的价值,wi是第i件物品的所占空间. m(i,j) 代表的含义是:目前只考虑第1到第i件物品放入总容量为j的背包所获得的最大价值.(背包总容量不可 ...

最新文章

  1. Android 正则表达式实例
  2. 这7个实用工具类网站,你用过几个?
  3. 任务间资源共享问题示例
  4. 手把手教你代码重构,是时候告别屎一样的代码了!
  5. Android 5.1 API 22 所有sdk文件下载地址
  6. 模板:广义二项式反演/广义容斥(组合数学)
  7. 为什么c语言软件调试不出来,急急急……求指导,程序调试不出来
  8. 极客c语言课程设计,c语言课程设计之实习报告共5天完整.doc
  9. Bailian4047 全排列【全排列】
  10. 32位与64位架构上的区别
  11. 模糊PID控制算法的C++实现
  12. tomcat8.0安装及配置教程
  13. 【jdk1.8特性】之Function
  14. 光环python培训
  15. Ubuntu - 消除登录界面小白点 - 禁用Guest来宾账户
  16. 【编程100%】22-08 字符串子序列
  17. 计算机主机不通电,电脑主机不通电无法开机怎么解决
  18. 计算机基础知识(基础入门小白专属)四
  19. 3d打印机喷头出现堵丝问题
  20. PyTorch之填充操作

热门文章

  1. 北大软微计算机技术硕士复试,2016北大软微考研复试细节和名单.doc
  2. 右键添加cmd命令快捷键,右键cmd快捷键丢失
  3. 【Monster High】MMD镜头+动作打包下载.zip
  4. JAVA网站后台管理系统
  5. origin画已知函数曲线_使用Origin进行函数绘图的方法
  6. 图解: 线程状态转换(线程生命周期这一篇够用了)
  7. 怎么把动图分解成图片?gif怎么拆分成几张?
  8. html5经纬度定位 源码_HTML5获取地理经纬度并通过百度接口得到实时位置
  9. endnote文献使用简明教程+遇到问题
  10. html倒计时星期日,功能齐全的jQuery倒计时插件