动态规划原理

动态规划的核心:填表

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

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

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

问题描述

有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. tensorflow 做加法
  2. VS 2005 Debugger crashing with IE 8
  3. rstrip,strip,lstrip字符串内置函数
  4. 了解使用Android ConstraintLayout
  5. 读书笔记之《程序员必读的职业规划书》
  6. 很多想法、很多感慨。
  7. VS Code + ML.NET 玩转交互式机器学习
  8. 反向图——dj算法(判断从起点 开始有没有第二条路径能到达)Gym 102501K
  9. 聊聊RocksDB Compact
  10. Mysql-5.5.3 主从同步不支持master-host问题的解决办法
  11. textarea的maxlength属性兼容解决方案
  12. python mro c3_Python的MRO以及C3线性化算法
  13. 【爱你 祖国】细看我国智能无人机如何从无到有?都是被逼出来的!
  14. jsp 判断时间大小
  15. python之 前端HTML/CSS基础知识学习笔记
  16. 良冶之子,必学为裘;良弓之子,必学为箕
  17. 绝好的一套针对初学者的JavaScript教程
  18. MD5加盐(md5+salt)
  19. tomcat乱码的几种解决
  20. 互联网江湖野史 - 氪金玩家

热门文章

  1. iphone软件破解教程(工具篇)
  2. struts2漏洞监测_全版本struts2漏洞练习
  3. (转)CD式随身播放器可能用到的软件,相关软件下载(更新于10.06.07)
  4. jpg转pdf文件转换器注册码
  5. fastposter v2.11.0 天花板级的海报生成器
  6. 基于javaweb的巡更巡检管理系统
  7. 企业数据资产管理平台建设方案(PPT)
  8. ADSafe3.5.4.721超精简汇编修改启动无提示爽歪歪直接退出版
  9. php 获取当前URL信息
  10. 尝试再造python编译器:龙书重制版