动态规划原理

动态规划的核心:填表

动态规划和分治法的相同点:把大问题拆分成小问题,再找大小问题间的递推关系。由最基本的小问题开始解决,逐渐解决大问题。

动态规划和分治法的不同点:分治法不会记忆中间的过程,因此需要重复计算子问题。动态规划以填表的形式将已经解决了的小问题的答案都记录下来,如有需要可随时提用,避免了重复计算,节省了时间。在问题满足最优性原理后,动态规划解决问题的核心就在于填表,表填写完毕,最优解就找到了。

最优性原理是动态规划的基础:即解决每一个小问题都采用最优的方式,因此其后的步骤可采用前面结果且不影响最优性。
(最优性原理是指“多阶段决策过程的最优决策序列具有这样的性质:不论初始状态和初始决策如何,对于前面决策所造成的某一状态而言,其后各阶段的决策序列必须构成最优策略”。:大佬原文中的解释)

问题描述

有n个物体(由输入数据组数决定),每个物体都有各自的体积和价值。现给定一容量一定的背包,求怎样装才能让背包所装总物体价值最大?
记背包容量为8,物体体积,价值如下。(以输入4组数据为例)

物体编号 体积 价值
1 2 3
2 3 4
3 4 5
4 5 6

问题分析

从最小容量开始分析填表(0-8)以totalvalue[j][k]记录最大价值表格信息
j记录物体数,k记录背包容量。

递推关系:每个商品都有两种可能
1:包的容量比当前物体小,不装入背包:此时价值与前j-1个相同,totalvalue[j][k]=totalvalue[j-1][k]
2:包的容量能装下当前物体,装入背包:此时价值等于背包剩余容量(背包当前总容量减去当前所装入物体的体积)最大价值+当前物体价值

因此填入totalvalue表时需对上述两种情况进行比较,取最大价值记录。

填表分析
如背包容量为0时,不论有几个物体待选,总价值都为0。

背包容量为1时,没有能装下的物体(物体体积,价值见上),总价值也为0

例背包容量为4时:当只有0个物体时,总价值为0。
当有第一个物体(体积2,价值3)能装时,4>2,装价值为3,不装价值为0,3>0所以选择装,最大价值为3。【列数4,行数1】填3

当有第二个物体(体积3,价值4)也能装时,4>3,不装,价值和只有第一个物体能装时相同,为3,装则价值=4(当前物体价值)+背包容量为1(当前背包总容量(4)-当前物体体积(3))时的最大价值(0)=4,4>3,所以选择装,最大价值为4。【列数4,行数2】填4

例题totalvalue表格如下

物体/背包容量 0 1 2 3 4 5 6 7 8
0 0 0 0 0 0 0 0 0 0
1 0 0 3 3 3 3 3 3 3
2 0 0 3 4 4 7 7 7 7
3 0 0 3 4 5 7 8 9 9
4 0 0 3 4 5 7 8 9 10

填完表格后最优解即为totalvalue[8][4] (所给背包容量,物品数对应的结果)

找最大价值物体组成(回溯)
背包容量一定,从最多物体开始分析
比较totalvalue[j][k]和totalvalue[j-1][k],若两者不相等,则说明当前物体被装入了背包,于是将k-当前物体的体积=k2,再比较totalvalue[j][k2]和totalvalue[j-1][k2]遍历直到k=0,由此判断背包剩余体积组成。

代码实现

#include<iostream>
using namespace std;
int totalvalue[1005][1005]={0};
//定义较大数组需放在main外做为全局变量 ,否则会导致程序无法输入直接终止的问题 int max(int m,int n)
{return m>n?m:n;
}//比较取大函数 int main()
{int totalspace;int m,n;//m-space,n-valueint space[1005],value[1005];int i=1,j=0,k=0;cin>>totalspace;while(cin>>m>>n&&m&&n){space[i]=m;value[i]=n;i++;//记录输入数据组数 }for(j=1;j<i;j++){for(k=1;k<=totalspace;k++){if(k<space[j])//背包容量小于物体体积,未装入 totalvalue[j][k]=totalvalue[j-1][k];else//当能装下时,需进行比较决定装或不装 totalvalue[j][k]=max(totalvalue[j-1][k],totalvalue[j-1][k-space[j]]+value[j]); }}//填totalvalue[][]这个表 ::重点 for(j=0;j<i;j++){for(k=0;k<=totalspace;k++)cout<<totalvalue[j][k]<<' ';cout<<endl;} //输出动态规划表(totalvalue) cout<<endl; for(j=i-1;j>1;j--){if(totalvalue[j][totalspace]!=totalvalue[j-1][totalspace]){cout<<j<<' ';totalspace-=space[j];//改变容量以找出下一个组成部分 }    } //输出最优解组成 cout<<endl;return 0;
}

为了学明白这个问题,我看了B站的视频讲解,也看了大佬的分析文章,此处附上大佬文章链接https://blog.csdn.net/qq_37767455/article/details/99086678?

01背包问题(动态规划解决)相关推荐

  1. 01背包问题 动态规划 java实现 简单通俗易懂

    ** 01背包问题 动态规划 ** 1.动态规划 什么是动态规划?动态规划就是将一个大问题不断向下拆分成小问题,直到拆分出的小问题可以求出其解,然后将小问题的解不断的向上合并,最终得到大问题的解决方案 ...

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

    计算机算法分析考试:动态规划0-1背包问题,怎么算她说她没醉,却一直摇摇晃晃掉眼泪:你说你爱她,却从未想过给她一个家. 要考试了,老师给划重点有一题:动态规划0-1背包问题,怎么算. 怎么理问题描述: ...

  3. 01背包问题动态规划(二维数组)

    01背包问题动态规划(二维数组) 问题描述 ​ 一个旅行者有一个最多能装 M 公斤的背包,现在有 n 件物品,它们的重量分别是W1,W2,-,Wn,它们的价值分别为C1,C2,-,Cn,求旅行者能获得 ...

  4. 0-1背包问题动态规划模型的Python解法

    0-1背包问题动态规划模型的Python解法 1.01背包问题 2.Python解决方案 3.01背包问题例题 1.01背包问题 背包问题(Knapsack problem)是一种组合优化的NP完全问 ...

  5. 0-1背包问题 动态规划java_C#使用动态规划解决0-1背包问题实例分析

    // 利用动态规划解决0-1背包问题 using System; using System.Collections.Generic; using System.Linq; using System.T ...

  6. 算法设计与分析 0-1背包问题 动态规划解法【超详细】

    0-1背包问题 问题描述 给定i个物品和一个容量为的背包,物品的重量是Wi,其价值为Vi 物品个数为i,背包容量为C. 如何选择装入背包内的物品,使得装入背包中的物品的总价值最大? 其中,每种物品只有 ...

  7. 01背包问题—动态规划求解

    动态规划 01 背包问题 关键代码 for (int i = 1; i <= n; ++i){for (int j = 0; j <= c; ++j){if (j < w[i]) / ...

  8. 【转】01背包问题动态规划详解

    转载自 sunstar1989 最终编辑 中华复生母 动态规划是用空间换时间的一种方法的抽象.其关键是发现子问题和记录其结果.然后利用这些结果减轻运算量. 比如01背包问题. 因为背包最大容量M未知. ...

  9. 01背包问题 动态规划求解方法 动态方程的详细解释 能理解的解释(附python代码)

    01背包问题属于组合优化问题:假设你要出门旅游,你现在有一个书包,这个书包的容量(capacity)有限,有很多物品如牙刷.防晒霜.雨伞.水杯等等,但书包装不下所有物品,因此我们必须有所取舍.那么通常 ...

  10. 01背包问题-动态规划算法(最简洁)

    动态规划算法: 思路:从第一个物品开始填表(m[i][j]),从左到右,从上到下 如果物品比背包容量大,即放不下,则m[i][j]=m[i-1][j] 如果物品比背包容量下,即放得下,则比较 放与不放 ...

最新文章

  1. 初识java类的接口实现
  2. modlesim使用
  3. mdl格式是什么软件生成的_Mac 上有什么好的视频格式转换软件?
  4. 21-5-22校赛J 下围棋
  5. linux 命令 考试,linux常用命令总结-第一次考试
  6. jemalloc mysql5.6_Mysql-5.6安装编译全教程
  7. CATransform3D 特效详解
  8. 比较两个数的大小的代码比较:(C语言)
  9. 有限元法 有限差分法 有限体积法
  10. 虚拟机怎么制作镜像文件
  11. 必须收藏的文档:IronPython脚本在TIBCO Spotfire中的使用
  12. Landlock:一种新型Linux安全模块
  13. 前端入门篇(四十)JS基础7浏览器原理和BOM
  14. PyCenterNetDetector is not in the models registry
  15. css3 calc的使用
  16. Vulnhub-Earth
  17. DPDK:UDP 协议栈的实现
  18. python byte 和 list[int]互转(byte to list,list to byte,byte to int)
  19. SwitchyOmega代理插件的安装与使用教程
  20. Hadoop实战记录-目录

热门文章

  1. 近期要读的书(经济类)
  2. web _html_css_七大选择器
  3. 达梦数据库DM8(一):新建数据库实例
  4. The package jxl is not accessible解决
  5. Adobe_Premiere_Pro_2023_23.2.0.69最新版介绍及图文安装教程
  6. MS9288C 视频转换IC VGA 转 HDMI
  7. Label mx条码软件导入多个数据库打印标签
  8. 探地雷达技术在道路检测中的应用
  9. 服务器集群虚拟化内存漂移,浅谈医院高稳定性虚拟化集群的部署
  10. 看到记忆的印迹:神经科学家们如何定位、唤醒甚至偷换记忆