125. 背包问题 II

描述

有 n 个物品和一个大小为 m 的背包. 给定数组 A 表示每个物品的大小和数组 V 表示每个物品的价值.

问最多能装入背包的总价值是多大?
A[i], V[i], n, m 均为整数
你不能将物品进行切分
你所挑选的要装入背包的物品的总大小不能超过 m

样例

样例 1:

输入: m = 10, A = [2, 3, 5, 7], V = [1, 5, 2, 4]
输出: 9
解释: 装入 A[1] 和 A[3] 可以得到最大价值, V[1] + V[3] = 9 
样例 2:

输入: m = 10, A = [2, 3, 8], V = [2, 5, 8]
输出: 10
解释: 装入 A[0] 和 A[2] 可以得到最大价值, V[0] + V[2] = 10

思路:

表示前个物品拼成重量的时候能获得的最大价值,可以得到递推表达式:

考虑最后一个物品是否被装入背包两种情况。具体实现如下。

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

你可能感兴趣的:(125. 背包问题 II)