本解法的价值矩阵生成由上到下,行表示不同的物品编号,第i行表示有i-1种物品;列表示重量限制。r[i][j]表示仅有i-1号物品时,重量限制为j时,可以得到的最大价值。

价值矩阵r[i][j],i是物品的编号,j是背包的重量限制;物品编号矩阵p[i][j],表示达到价值r[i][j]时,背包里的物品最大编号。可以通过p[i][j] - p[i][ j - w[i - 1]]得到除去该最大编号物品后,物品第二大的编号,以此类推得到全部物品的清单。

r的生成是从上到下的,r[i][j] = max( r[i - 1][j], r[i][j - w[i - 1]] + v[i - 1] )。前一个是不加入节点i,则价值与只有i-1个节点,重量限制为j的价值相同。后一个是加入一个节点i,则价值为本行去除节点i的重量后,重量限制j-w[i]对应的价值,加上节点i能带来的价值v[i-1]。

下方大篇幅为完全背包代码。

若0-1背包有以下区别。

区别1 初始化时:

r[1][i] = i / w[0] * v[0];  --->   if(i<w[0]) r[1][i] = 0; else r[1][i] = v[0];

区别2 决定是否加入物品i时:

if(r[i - 1][j] > v[i - 1] + r[i][j - w[i - 1]]) --->
<pre name="code" class="cpp">if(r[i - 1][j] > v[i - 1] + r[i - 1][j - w[i - 1]])
#include <iostream>
#include <memory.h>
using namespace std;int main(){int v[] = {1, 3, 5, 9};int w[] = {2, 3, 4, 7};int b = 10;int n = sizeof(v) / sizeof(v[0]);int **p = new int* [n + 1];//记录达到当前价值时装入的物品的最大编号,用于确定最后需要如何装入物品来达到最大价值int **r = new int* [n + 1];//记录动态规划的最大价值int i, j;for(i = 0; i < n + 1; i++){//创建二维矩阵,并初始化第一列的值为1r[i] = new int [b + 1];p[i] = new int [b + 1];r[i][0] = 0;p[i][0] = 0;}for(i = 0; i < b + 1; i++){//只装入第一件物品,作为动态规划的起始值r[0][i] = 0;r[1][i] = i / w[0] * v[0];p[0][i] = 0;if(r[1][i]){//不为0,说明装入了第一件物品p[1][i] = 1;    }else{p[1][i] = 0;}}for(i = 2; i < n + 1; i++){for(j = 1; j < b + 1; j++){if(w[i - 1] > j){//当前物品装不进去r[i][j] = r[i - 1][j];p[i][j] = p[i - 1][j];}else{//能装入当前物品,比较装入该物品(该物品价值 + 去掉该物品重量后,剩余重量所能达到的最大价值)和不装入该物品哪种情况价值更高,选择高的那个if(r[i - 1][j] > v[i - 1] + r[i][j - w[i - 1]]){//不装入当前物品r[i][j] = r[i - 1][j];p[i][j] = p[i - 1][j];}else{//装入当前物品r[i][j] = v[i - 1] + r[i][j - w[i - 1]];p[i][j] = i;}}}}int *o = new int [n];//记录达到最大价值时装入的每一件物品的数量memset(o, 0, n * sizeof(int));i = b;//当前背包重量while(i > 0){j = p[n][i];if(j > 0){o[j - 1]++;i -= w[j - 1];}else{break;}}cout<<"最大价值:"<<r[n][b]<<endl;for(i = 0; i < n; i++){cout<<"物品"<<i + 1<<":"<<o[i]<<"件"<<endl;}return 0;
}

动态规划-背包问题求解过程【代码 from eason】相关推荐

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

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

  2. 经典动态规划————背包九讲

    前言 本篇文章是我(dd_engi)正在进行中的一个雄心勃勃的写作计划的一部分,这个计划的内容是写作一份较为完善的NOIP难度的动态规划总结,名为<解动态规划题的基本思考方式>.现在你看到 ...

  3. 0x52. 动态规划 - 背包(习题详解 × 19)

    目录 0x52. 动态规划 - 背包 0x52.1 0/10/10/1 背包 Problem A. 数字组合 Problem B. 背包问题求具体方案 Problem C. jury Compromi ...

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

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

  5. vba代码编程800例_VBA编程常用“积木”过程代码Address的含义

    蓝字关注,加微信NZ9668获资料信息  VBA解决方案   系列丛书作者  头条百家平台 VBA资深创作者 _______________________________ 大家好,今日继续和大家分享 ...

  6. 模块加载过程代码分析1

    一.概述 模块是作为ELF对象文件存放在文件系统中的,并通过执行insmod程序链接到内核中.对于每个模块,系统都要分配一个包含以下数据结构的内存区. 一个module对象,表示模块名的一个以null ...

  7. python批量处理csv_Python批量处理csv并保存过程代码解析

    本篇文章小编给大家分享一下Python批量处理csv并保存过程代码解析,代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看. 需求: 1.大量csv文件,以数字命 ...

  8. vba代码编程800例_VBA编程常用过程代码实例2630

    蓝字关注,加微信NZ9668获资料信息  VBA解决方案   系列丛书作者  头条百家平台 VBA资深创作者 _______________________________ 分享成果,随喜真能量.大家 ...

  9. 用计算机求解问题的一般步骤,计算机问题求解过程包括哪些步骤

    计算机问题求解过程包括分析问题.设计算法.编写程序.调试运行.检测结果. 电子计算机(electronic computer)通称电脑,是现代一种用于高速计算的电子计算机器,可以进行数值计算.逻辑计算 ...

  10. 【算法】动态规划 ④ ( 动态规划分类 | 坐标型动态规划 | 前缀划分型动态规划 | 前缀匹配型动态规划 | 区间型动态规划 | 背包型动态规划 )

    文章目录 一.动态规划场景 二.动态规划分类 1.坐标型动态规划 2.前缀划分型动态规划 3.前缀匹配型动态规划 4.区间型动态规划 5.背包型动态规划 一.动态规划场景 动态规划 动态规划使用场景 ...

最新文章

  1. 导师讨厌什么样的学生 ?
  2. MyEclipse8.5注册码 到2015年
  3. php文件怎么设置隐藏显示代码,php文件隐藏的方法
  4. python实现监控增量_python 日志增量抓取实现方法
  5. 博弈-Green Hackenbush(无向图删边)
  6. oracle删除schema下所有对象,清空Schema中所有对象的步骤
  7. lamp mysql登录_LAMP 3.2 mysql登陆
  8. php mysql完全自学手册 smarty_PHPSmarty完全开发手册.pdf
  9. 408计算机考研2012真题解析,2018年计算机408统考考研真题及答案解析.pdf
  10. 应用程序无法正常启动0xc0150002+vs2005配置opencv2.2.0
  11. WIN10系统“计算机无法访问,您可能没有权限使用网络资源.请与这台服务器的管理员联系“的解决办法
  12. Python10行代码实现模拟百度搜索
  13. 【头歌实验】五、Python循环结构
  14. ElementUI级联框回显问题
  15. 如何将当前时间为:Sun Jan 08 16:47:00 CST 2023格式转换成“yyyy-MM-dd HH:mm:ss“
  16. Oracle索引梳理系列(七)- Oracle唯一索引、普通索引及约束的关系
  17. TeamFoundation Server 使用技巧
  18. 树莓派3B安装ffmpeg
  19. Vue05之ElementUI入门+nodejs环境搭建+运行nodejs项目
  20. linux无损转换磁盘成gpt分区,Linux下数据无损动态修改MBR分区表格式为GPT

热门文章

  1. Android程序员必装apk
  2. linux系统怎么设任务计划,在Linux系统上设置计划任务
  3. 《构架师的12项修炼》读书笔记
  4. c语言解三色旗问题加注释,C语言经典算法——三色旗问题
  5. paip.重装系统后svn服务器修复
  6. 读书笔记2014第6本:《The Hunger Games》
  7. Springboot毕设项目查听课管理系统zkb6w(java+VUE+Mybatis+Maven+Mysql)
  8. java课程综合实训报告_Java ME综合实训报告
  9. HE4484E芯片资料
  10. 如何安装Eclipse WTP插件