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

思路:

dp[i][j]表示前i个物品拼成重量j的时候能获得的最大价值,可以得到递推表达式:
dp[i][j]=max(dp[i-1][j],dp[i-1][j-A[i-1]])
考虑最后一个物品是否被装入背包两种情况。具体实现如下。

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<int> &A, vector<int> &V) {
        // write your code here
        int n=A.size();
        if(!n)
        {
            return 0;
        }
        vector<vector<int>> dp(n+1,vector<int>(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;
    }
};
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容