lintcode backpack 背包问题

问题描述

lintcode

笔记

通常这种动态规划的问题需要建一个表作为缓存,然后搞清楚每个元素的含义,以及元素之间的递推关系。

在这里建立一个二维表buff,行号i代表第几件物品,列号j代表背包容量。以物品w=[2,3,5,7]和容量m=11为例。buff[i][j]的含义是考虑第i件物品,容量为j的时候,所能放下的最大容量。那么,递推关系应该是:

buff[i][j] = max(buff[i-1][j], buff[[i-1][j-w[i]]+w[i])

可以认为buff[i-1][j]是考虑完了第i-1件物品,现在要考虑第i件物品了。可能的操作是,放入第i件物品,或者不放。
1. 不放。那就是buff[i-1][j]。
2. 放。给当前情况腾出w[i]这么大的空间,看一下buff[i-1][j-w[i]]最大能装到多少,再把当前物品装进去。
最后的结果就取两者的较大值。

01234567891011
0002222222222
1002335555555
2

最后还可以省下一些空间,只用一行数据,后来的数据覆盖这一行的数据即可。使用这种办法的话需要从后往前计算,防止覆盖”上一行“的值。

代码

class Solution {
public:
    /**
     * @param m: An integer m denotes the size of a backpack
     * @param A: Given n items with size A[i]
     * @return: The maximum size
     */
    int backPack(int m, vector<int> A) {
        // write your code here
        const int nItem = A.size();
        int buff[m+1];
        for (int i = 0; i <= m; i++)
            buff[i] = 0;
        for (int j = 0; j < nItem; j++)
        {
            for (int i = m; i >= A[j]; i--)
            {
                buff[i] = max(buff[i], buff[i-A[j]]+A[j]);
            }
        }
        return buff[m];
    }
};

背包问题2

class Solution {
public:
    /**
     * @param m: An integer m denotes the size of a backpack
     * @param A & V: Given n items with size A[i] and value V[i]
     * @return: The maximum value
     */
    int backPackII(int m, vector<int> A, vector<int> V) {
        // write your code here
        int buff[m+1];
        for (int i = 0; i <= m; i++)
            buff[i] = 0;
        const int nItem = A.size();
        for (int j = 0; j < nItem; j++)
        {
            for (int i = m; i >= A[j]; i--)
            {
                buff[i] = max(buff[i], buff[i-A[j]]+V[j]);
            }
        }
        return buff[m];
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值