算法 动态规划学习——背包问题
动态规划
动态规划,又名DP算法(取自其Dynamic Programming的缩写),最初是运筹学的一个分支,是用来求解决策过程最优化的数学方法。
动态规划算法通常用于求解具有某种最优性质的问题。
动态规划应用场景:
适用动态规划的问题必须满足最优化原理、无后效性和重叠性。
1、最优化原理(最优子结构性质) 最优化原理可这样阐述:一个最优化策略具有这样的性质,不论过去状态和决策如何,对前面的决策所形成的状态而言,余下的诸决策必须构成最优策略。简而言之,一个最优化策略的子策略总是最优的。一个问题满足最优化原理又称其具有最优子结构性质。
2、无后效性 将各阶段按照一定的次序排列好之后,对于某个给定的阶段状态,它以前各阶段的状态无法直接影响它未来的决策,而只能通过当前的这个状态。换句话说,每个状态都是过去历史的一个完整总结。这就是无后向性,又称为无后效性。
3、子问题的重叠性 动态规划将原来具有指数级时间复杂度的搜索算法改进成了具有多项式时间复杂度的算法。其中的关键在于解决冗余,这是动态规划算法的根本目的。动态规划实质上是一种以空间换时间的技术,它在实现的过程中,不得不存储产生过程中的各种状态,所以空间复杂度要大于其它的算法。
背包问题
给定 n 种物品和一个容量为 C 的背包,物品 i 的重量是 w,其价值为 v 。
问:应该如何选择装入背包的物品,使得装入背包中的物品的总价值最大?
具体题目
可以使用一个表格去进行演示
解法归纳:
一、如果装不下当前物品,那么前n个物品的最佳组合和前n-1个物品的最佳组合是一样的。
二、如果装得下当前物品。
假设1 :装当前物品,在给当前物品预留了相应空间的情况下,前n-1 个物品的最佳组合加上当前物品的价值就是总价值。
假设2:不装当前物品,那么前n个物品的最佳组合和前n-1个物品的最佳组合是一样的。
选取假设1和假设2中较大的价值,为当前最佳组合的价值。
背包问题回溯
问题进阶:在使得背包内总价值最大的情况下,背包内装了哪些物品?
就相当于在表格当中从后往前逆推
归纳:
从表的右下角开始回溯,如果发现前n个物品最佳组合的价值和前n-1个物品最佳组合的价值一样,说明第n个物品没有被装入。否则,第n个物品被装入。
学习来源
https://www.bilibili.com/video/av62953142?from=search&seid=1091357594351821841
一起学习,一起进步 -.- ,如有错误,可以发评论