美文网首页动态规划
440. 背包问题 III

440. 背包问题 III

作者: 薄荷糖的味道_fb40 | 来源:发表于2019-05-23 13:18 被阅读2次

    描述

    给定 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;
        }
    };
    

    相关文章

      网友评论

        本文标题:440. 背包问题 III

        本文链接:https://www.haomeiwen.com/subject/nkpvzqtx.html