"); //-->
导语:动态规划(Dynamic programming)是一种在数学、计算机科学和经济学中使用的方法。动态规划算法与分治法类似,通过将带求解的问题分解为若干个相对简单的子问题(阶段)的方式,来求解复杂问题。本文作者用相对精炼的篇幅内容对动态规划算法进行背景及原理介绍,并举例说明如何进行问题分解和求解答案,与各位读者共同探讨分享。
01|问题背景
在日常生活中,我们可能经常会遇到这样的问题:用100块钱去买10件东西,怎样买会比较合适?将其抽象化就能得到经典的篮子问题——
假设我们有n种类型的物品,编号分别为1、2、...n,其中编号为i的物品价值为vi,它的价值为wi。在这里设定价值和重量都是整数。现在假设我们有一个背包,怎样才能在不超过背包容量的情况下放入价值最大化的物品?
解决这个问题有两个思路:
■ 第一种是穷举法,列举出所有的可能,选择其中的最优解;
■ 第二种是动态规划算法,将大问题拆分为小问题,我们只考虑每一件物品放或者不放,然后循环计算所有的物品放置或者不放置后的价值,最后得到最优的结果。
02|基本原理
动态规划算法是最优化算法中的一种,其基本思想是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解里面得到原问题的解。
动态规划的基本过程可以分为以下几步:
A. 划分状态,即划分子问题
B. 状态表示,即用数学的方法将问题抽象出来
C. 状态转移,即子问题之间是如何进行流转的
D. 确定边界,即初始状态和最终状态应该如何确定
03|算法详解
下面我们按照上面动态规划的基本流程来进行篮子问题的解析。首先,将问题抽象成数学表达式,进行如下规定:
A. 代表第i件物品,空间容量为j时背包中的最大价值
B. 代表第i件物品的价值
其次,按照动态规划的过程进行问题分解:
A. 划分状态:当背包中放入物品i时,背包内的最大价值为多少
B. 状态表示:即抽象出的数学公式,
C. 状态转移:背包问题中,状态转移即为不同物品放入其中
D. 确定边界:初始情况下
解析完篮子问题后,得到算法如下所示:
04|实例说明
接下来,我们再用实际的例子以及图标来解释上面算法的流程。
比如有三件物品,分别是:
A. 书本(体积为3,价值为300)
B. 笔筒(体积为2,价值为200)
C. 橡皮(体积为2,价值为100)
另外,背包体积为6,带入算法公式,结果如图所示:
各个颜色表示最优方案,其中:
A. 白块表示初始化区域
B. 绿块表示不取物品最大
C. 红块表示取物品时最大
分析可知:当书本和笔筒放入背包时,能够价值最大化,橡皮一直是绿色的,说明没有被取到。
05|总结
篮子问题只是动态算法的一个应用,上面的算法也只是动态规划算法的一种,关键是要理解动态规划算法的精髓,学会分析复杂的问题,最终实现将问题大而化小,小而化了。
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。