转载:https://www.cnblogs.com/variance/p/6909560.html
动态规划之01背包问题(含代码C)
1.动态规划的基本思想

  动态规划算法通常用于求解具有某种最优性质的问题。其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。若用分治法来解这类问题,则分解得到的子问题数目太多,有些子问题被重复计算了很多次。如果我们能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,这样就可以避免大量的重复计算,节省时间。我们可以用一个表来记录所有已解的子问题的答案。不管该子问题以后是否被用到,只要它被计算过,就将其结果填入表中。这就是动态规划法的基本思路。具体的动态规划算法多种多样,但它们具有相同的填表格式。 与分治法最大的差别是:适合于用动态规划法求解的问题,经分解后得到的子问题往往不是互相独立的(即下一个子阶段的求解是建立在上一个子阶段的解的基础上,进行进一步的求解)

2.动态规划的应用场景

  适用动态规划的问题必须满足最优化原理、无后效性和重叠性。

  a.最优化原理(最优子结构性质) 最优化原理可这样阐述:一个最优化策略具有这样的性质,不论过去状态和决策如何,对前面的决策所形成的状态而言,余下的诸决策必须构成最优策略。简而言之,一个最优化策略的子策略总是最优的。一个问题满足最优化原理又称其具有最优子结构性质。

  b.无后效性 将各阶段按照一定的次序排列好之后,对于某个给定的阶段状态,它以前各阶段的状态无法直接影响它未来的决策,而只能通过当前的这个状态。换句话说,每个状态都是过去历史的一个完整总结。这就是无后向性,又称为无后效性。

  c.子问题的重叠性动态规划将原来具有指数级时间复杂度的搜索算法改进成了具有多项式时间复杂度的算法。其中的关键在于解决冗余,这是动态规划算法的根本目的。动态规划实质上是一种以空间换时间的算法,它在实现的过程中,不得不存储产生过程中的各种状态,所以它的空间复杂度要大于其它的算法

3.01背包问题建模:如下图

图片中abc三个公式详细解析:
a式表示前iii个物品中挑选放入承重为0的背包中和没有物品放入承重为j" role="presentation" style="position: relative;">jjj的背包中是相等为0。
b式表明:如果第iii个物品的重量大于背包的容量,则装人前i" role="presentation" style="position: relative;">iii个物品得到的最大价值和装入前i−1i−1i-1个物品得到的最大价是相同的,即物品iii不能装入背包。
c式表明:如果第i" role="presentation" style="position: relative;">iii个物品的重量小于背包的容量,则会有一下两种情况:
(1)如果把第iii个物品装入背包,则背包物品的价值等于第i−1" role="presentation" style="position: relative;">i−1i−1i-1个物品装入容量位j−wij−wij-w_i 的背包中的价值加上第iii个物品的价值vi" role="presentation" style="position: relative;">viviv_i;
(2)如果第i−1i−1i-1个物品没有装入背包,则背包中物品价值就等于把前i−1i−1i-1个物品装入容量为jjj的背包中所取得的价值。显然,取二者中价值最大的作为把前i" role="presentation" style="position: relative;">iii个物品装入容量为jj<script type="math/tex" id="MathJax-Element-63">j</script>的背包中的最优解。

4.动态规划的时间效率为O(nc)其中n表示物品的个数,c表示背包的容量。空间的效率就是用于存储二维数组的占用空间大小,即为O(nc).

#include<stdio.h>
#include<cstdlib>
int V[200][200];//前i个物品装入容量为j的背包中获得的最大价值
int max(int a, int b)
{if (a >= b)return a;else return b;
}int KnapSack(int n, int w[], int v[], int x[], int C)
{int i, j;for (i = 0; i <= n; i++)V[i][0] = 0;for (j = 0; j <= C; j++)V[0][j] = 0;for (i = 0; i < n; i++) {for (j = 0; j < C + 1; j++) {if (j<w[i])V[i][j] = V[i - 1][j];elseV[i][j] = max(V[i - 1][j], V[i - 1][j - w[i]] + v[i]);}}j = C;for (i = n - 1; i >= 0; i--){if (V[i][j]>V[i - 1][j]){x[i] = 1;j = j - w[i];}elsex[i] = 0;}printf("选中的物品是:\n");for (i = 0; i<n; i++)printf("%d ", x[i]);printf("\n");for (int i = 0; i < n; i++) {for (int j = 0; j < C + 1; j++) {printf("%d\t ", V[i][j]);if (j == C) {printf("\n");}}}return V[n - 1][C];}int main()
{int s;//获得的最大价值int w[5] = { 2,2,6,5,4 };//物品的重量int v[5] = { 6,3,5,4,6 };//物品的价值int x[5];//物品的选取状态int n = 5;int C = 10;//背包最大容量s = KnapSack(n, w, v, x, C);printf("最大物品价值为:\n");printf("%d\n", s);system("pause");return 0;}
选中的物品是:
1 1 0 0 1
0        0       6       6       6       6       6       6       6       6       6
0        0       6       6       9       9       9       9       9       9       9
0        0       6       6       9       9       9       9       11      11      14
0        0       6       6       9       9       9       10      11      13      14
0        0       6       6       9       9       12      12      15      15      15
最大物品价值为:
15
请按任意键继续. . .

动态规划之01背包问题(含代码C)相关推荐

  1. 经典动态规划:0-1 背包问题

    经典动态规划:0-1 背包问题 文章目录 经典动态规划:0-1 背包问题 一.题目描述 二.动规标准套路 三.题目描述 四.解法分析 五.优化 一.题目描述 就讨论最常说的 0-1 背包问题,简单描述 ...

  2. 动态规划解决0-1背包问题详解(图文并茂)

    动态规划解决0-1背包问题 这个是网上比较好的案例,因为原文有些地方晦涩难懂,对于刚接触动态规划问题的朋友来说很不友好,所以很对地方加入了我自己的见解,也是作为我的一次学习历程. 一.问题描述: 有n ...

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

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

  4. o-1背包问题迭代_经典动态规划:01背包问题的变体

    点击上方蓝字设为星标 东哥带你手把手撕力扣~ 作者:labuladong   公众号:labuladong 若已授权白名单也必须保留以上来源信息 上篇文章 经典动态规划:0-1 背包问题 详解了通用的 ...

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

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

  6. 【动态规划】01背包问题(c++代码逐句分析)

    01背包问题是一个经典的动态规划问题,不过并不适合作为动态规划的入门训练,适合作为一个动态规划的进阶训练题.如果你在此前从未接触过动态规划,那么建议先点个收藏,在学习了动态规划的相关知识点并且做了一些 ...

  7. 动态规划之0-1背包问题(思路详解+表格演示过程+最优解打印方法+详细代码)

    问题简介 输入:n种物品和一个背包 物品i的重量是wi,价值为vi 背包的容量是C 输出:装入背包的物品 优化目标是:装入背包的物品总价值最大 优化子结构 设(x1,x2,x3-xn)是0-1背包问题 ...

  8. 三十四、动态规划解决01背包问题

    一.动态规划算法介绍 动态规划算法的核心思想是:将大问题划分为小问题进行解决,从而一步一步获取最优解的处理算法. 动态规划算法与分治算法类似,其基本思想是将待求解的问题分解成若干个子问题,先求子问题, ...

  9. 算法题解:动态规划解0-1背包问题

    概述 背包问题(Knapsack problem)是一种组合优化的NP完全问题.问题可以描述为:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高.问 ...

  10. 【动态规划】01背包问题

    01背包问题 问题描述 给定 N 种物品和一个最大载重量为 C 的背包,物品 i 的重量是 wi,其价值为 vi . 问:应该如何选择装入背包的物品,使得装入背包中的物品的总价值最大? 问题分析 对于 ...

最新文章

  1. synchronized底层原理_你用过synchronized吗?它的底层原理是什么?Java经典面试题来了...
  2. 使用apache的activemq集合JMS处理异步消息
  3. 20行Python代码实现视频字符化
  4. android studio import android-source-code
  5. 线程打印_线程知识回顾
  6. 计算机广告制作未来发展还行吗,计算机多媒体设计专业和广告设计制作那个好...
  7. 鸿蒙os开启第二批公测,鸿蒙OS开启第二批公测,7款机型加入升级名单,NOVA用户恭喜了...
  8. vscode插件推荐
  9. 经纬度,墨卡托等坐标转换
  10. PowerShell因为在此系统中禁止执行脚本解决方法
  11. python选择排序算法图解_简单选择排序算法(C语言详解版)
  12. 【转】LDA-linear discriminant analysis
  13. 在centos中运行出现错误:cannot find -lbz2
  14. TOEFL wordlist 35
  15. Pollard rho整数分解法
  16. np.linalg.inv方法详解
  17. 除了编码,还要会说话(1)
  18. 电脑上怎么同时录制系统和麦克风声音
  19. 通过单片机定时器输出周期为1s的方波,驱动LED灯闪烁
  20. 华测P550数据导入睿铂Skyscanner工作流程

热门文章

  1. 二级公共基础知识_二级公共基础知识 01
  2. mybatis-plus删除操作(逻辑与物理删除)
  3. 后端的日期类型赋值前端表单_后端获取前端数据的四种方式
  4. 前端入职后很痛苦_NGW前端新技术赛场:Serverless SSR 技术内幕
  5. vmnet0 子网ip和子网掩码_IP地址知识介绍及子网划分与汇总
  6. python selenium click 动态加载_python selenium:不要等到click()命令之后加载页面
  7. await js 报错_async/await优雅的错误处理方法总结
  8. MyBatis学习笔记(3)-动态SQL
  9. spring boot+mybatis+quartz项目的搭建
  10. HashMap,LinkedHashMap,IdentityHashMap,HashSet之间的异同