动态规划

440. 背包问题 III

2019-05-23  本文已影响2人  薄荷糖的味道_fb40

描述

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

不能将一个物品分成小块.
放入背包的物品的总大小不能超过 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).

思路:

dp[i][j]表示前i种物品组成的重量为j的组合最大价值。可知
dp[i][j]=\max _{k\geq 0} (dp[i-1][j-k \cdot A[i-1]]+k \cdot V[i-1])
画画二维矩阵找规律就能找到空间优化的方法,即
dp[j]=\max (dp[j-A[i-1]]+V[i-1],dp[j])
具体实现如下。

class Solution {
public:
    /**
     * @param A: an integer array
     * @param V: an integer array
     * @param m: An integer
     * @return: an array
     */
    int backPackIII(vector<int> &A, vector<int> &V, int m) {
        // write your code here
        int n=A.size();
        if(!n)
        {
            return 0;  
        }
        vector<int> 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;
    }
};
上一篇下一篇

猜你喜欢

热点阅读