天天看点

01背包问题理解动态规划算法

一.动态规划算法

简单理解:在一些分治算法解决的问题中,需要将较大规模的问题转化为较小规模的问题,往往会用到递归。但是在一些问题中,递归的小问题被多次重复运算,浪费了性能,因此可以使用数组或者其他合适的方式将运算过的小规模问题的结果记录下来,再运算小规模的问题时先看是不是已经运算过了,没有运算过再去运算并将结果保存,所以一般分治算法都是从大规模问题开始递归运算,不断将问题规模变小,而动态规划算法则一般从小规模问题开始运算,每次运算分解出的小规模问题都是已经运算过的。如此便使用了存储空间换取了运算时间,减小了时间复杂度。

二.01背包问题

01背包问题理解动态规划算法

 1.穷举法

可以先不考虑背包,考虑被拿走的物品的所有组合情况,n个物品有2n种拿法(每个物品都可以选择拿或者不拿),然后再判断每一种拿法是否能放入背包,能放入背包的情况下计算总价值并比较出最大价值。

01背包问题理解动态规划算法

 2.分治算法(自上而下分解问题)

 这个问题的分治算法的核心是将物品逐个放入背包,有以下几种情况:

1)背包没有剩余重量了

2)当前物品的编号为0,即所有的物品都试过了

3)当前物品太重,无法放入背包

4)当前物品可以放入背包

在第4)种情况下,有两种情况,一种放入物品得到的价格最大,一种不放入物品得到的价格最大(因为放入物品后背包的剩余可放入重量也变小了,所以放入当前物品对后续物品能否放入的情况有影响,因此不一定是将当前物品放入得到的总价格最高,需要实际求解并判断),因此需要进行比较得到最大价格

01背包问题理解动态规划算法

 3.改进分治算法,使用数组记录已经运算过的问题结果

4.动态规划算法(自下而上计算问题)

继续阅读