440. 背包问题 III

描述

给定 种物品, 每种物品都有无限个. 第 个物品的体积为 , 价值为 .
再给定一个容量为 的背包. 问可以装入背包的最大价值是多少?

不能将一个物品分成小块.
放入背包的物品的总大小不能超过 m.

样例

样例 1:

输入: A = [2, 3, 5, 7], V = [1, 5, 2, 4], m = 10
输出: 15
解释: 装入三个物品 1 (A[1] = 3, V[1] = 5), 总价值 15.
样例 2:

输入: A = [1, 2, 3], V = [1, 2, 3], m = 5
输出: 5
解释: 策略不唯一. 比如, 装入五个物品 0 (A[0] = 1, V[0] = 1).

思路:

表示前种物品组成的重量为的组合最大价值。可知

画画二维矩阵找规律就能找到空间优化的方法,即

具体实现如下。

class Solution {
public:
    /**
     * @param A: an integer array
     * @param V: an integer array
     * @param m: An integer
     * @return: an array
     */
    int backPackIII(vector &A, vector &V, int m) {
        // write your code here
        int n=A.size();
        if(!n)
        {
            return 0;  
        }
        vector dp(m+1,-1);
        dp[0]=0;
        int res=0;
        for(int i=1;i<=n;i++)
        {
            for(int j=0;j<=m;j++)
            {
                if(j-A[i-1]>=0 && dp[j-A[i-1]]!=-1)
                {
                    dp[j]=max(dp[j-A[i-1]]+V[i-1],dp[j]);
                }
                res=max(res,dp[j]);
            }
        }
        return res;
    }
};

你可能感兴趣的:(440. 背包问题 III)