来源是慕课网的实战算法课程——动态规划
01背包问题

相当于还是求n个物品的组合!
暴力解法:
每一件物品,都可以放进背包,也可以不放进。复杂度是O( (2^n) * n ), 对于每一个组合,还要看看对应的总重是多少,看看是不是超过了容量C,从而看价值。
组合方式都可以用递归的方式来求解。只是是能不能找到重叠子问题、最优子结构,从而转换为DP。
设计:
状态:之前状态都使用一个参数就解决了问题,通常问题中参数的个数意味着要解决问题需要满足的约束条件。
这个问题2个约束条件,首先要从n个物品里选,然后容量要满足≤C,因此:状态(函数)是
F(n,C)考虑将n个物品放入容量为C的背包,使得价值最大。
状态转移:F( i,c) = F(i-1,c)
= v(i) + F( i-1, c-w(i) ) 放入后,考虑前面i-1个物品
对于第i个物品到底要放入or不放入背包,在二者中选一个max
状态转移方程:F(i,c) = max( F(i-1,c), v(i) + F( i-1, c-w(i) ) )
很多动态规划问题都可以使用类似上面的思想!
写代码:依旧先使用自顶向下,再改造为自底向上
递归方式:
class
Knapsack01 {
private:
// 用[0,...index]的物品,来填充容积为c的背包的最大值
int bestValue(const vector<int> &w, const vector<int> &v, int index, int c){
// 无法选物品 or 装不下物品,


6559

被折叠的 条评论
为什么被折叠?



