【算法学习】01背包问题

来源是慕课网的实战算法课程——动态规划

01背包问题

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 装不下物品,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值