440. 背包问题 III
2019-05-23 本文已影响2人
薄荷糖的味道_fb40
描述
给定 种物品, 每种物品都有无限个. 第 个物品的体积为 , 价值为 .
再给定一个容量为 的背包. 问可以装入背包的最大价值是多少?
不能将一个物品分成小块.
放入背包的物品的总大小不能超过 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<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;
}
};