NC309. 完全背包
描述
示例1
输入:
6,2,[[5,10],[3,1]]
输出:
[10,2]
示例2
输入:
8,3,[[3,10],[9,1],[10,1]]
输出:
[20,0]
说明:
无法恰好装满背包。示例3
输入:
13,6,[[13,189],[17,360],[19,870],[14,184],[6,298],[16,242]]
输出:
[596,189]
说明:
可以装5号物品2个,达到最大价值298*2=596,若要求恰好装满,只能装1个1号物品,价值为189.C++ 解法, 执行用时: 4ms, 内存消耗: 512KB, 提交时间: 2022-06-18
class Solution { public: vector<int> knapsack(int v, int n, vector<vector<int> >& nums) { vector<int> a(v + 1, 0); vector<int> b(v + 1, INT_MIN); b[0] = 0; for (int i = 1; i <= n; i++) { int x = nums[i - 1][0];//最大容量 int y = nums[i - 1][1];//最大价值 for (int j = x; j <= v; j++) { a[j] = max(a[j], a[j - x] + y); b[j] = max(b[j], b[j - x] + y); } } vector<int> c(2); c[0] = a[v]; c[1] = b[v] > 0 ? b[v] : 0; return c; } };
C++ 解法, 执行用时: 4ms, 内存消耗: 512KB, 提交时间: 2022-05-04
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param v int整型 * @param n int整型 * @param nums int整型vector<vector<>> * @return int整型vector */ vector<int> knapsack(int v, int n, vector<vector<int> >& nums) { // write code here vector<int> dp_1(v + 1, 0); vector<int> dp_2(v + 1, INT_MIN); dp_2[0] = 0; for (int i = 1; i <= n; i++) { int weight = nums[i - 1][0]; int value = nums[i - 1][1]; for (int j = weight; j <= v; j++) { dp_1[j] = max(dp_1[j], dp_1[j - weight] + value); dp_2[j] = max(dp_2[j], dp_2[j - weight] + value); } } vector<int> dp(2); dp[0] = dp_1[v]; dp[1] = dp_2[v] > 0 ? dp_2[v] : 0; return dp; } };
C++ 解法, 执行用时: 5ms, 内存消耗: 416KB, 提交时间: 2022-06-26
class Solution { public: vector<int> knapsack(int v, int n, vector<vector<int> >& nums) { vector<int> a(v + 1, 0); vector<int> b(v + 1, INT_MIN); b[0] = 0; for (int i = 1; i <= n; i++) { int x = nums[i - 1][0];//最大容量 int y = nums[i - 1][1];//最大价值 for (int j = x; j <= v; j++) { a[j] = max(a[j], a[j - x] + y); b[j] = max(b[j], b[j - x] + y); } } return {a[v], b[v] > 0 ? b[v] : 0}; } };
C++ 解法, 执行用时: 5ms, 内存消耗: 428KB, 提交时间: 2022-08-06
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param v int整型 * @param n int整型 * @param nums int整型vector<vector<>> * @return int整型vector */ vector<int> knapsack(int v, int n, vector<vector<int> >& nums) { // write code here vector<int> a(v+1,0); vector<int> b(v+1,INT_MIN); b[0]=0; for(int i=1;i<=n;i++) { int x=nums[i-1][0]; int y=nums[i-1][1]; for(int j=x;j<=v;j++) { a[j]=max(a[j],a[j-x]+y); b[j]=max(b[j],b[j-x]+y); } } vector<int> c(2); c[0]=a[v]; c[1]=b[v]>0?b[v]:0; return c; } };
C++ 解法, 执行用时: 5ms, 内存消耗: 428KB, 提交时间: 2022-08-06
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param v int整型 * @param n int整型 * @param nums int整型vector<vector<>> * @return int整型vector */ vector<int> knapsack(int v, int n, vector<vector<int> >& nums) { // write code here // vector<int> dp(v+1,0); vector<int> ans(2,0); vector<int> ws(v+1,0); vector<int> vs(v+1,0); for(int i = 0;i<n;++i){ int s = nums[i][0];//sz int w = nums[i][1];//ws for(int j = s;j<=v;++j){ ws[j] = std::max(ws[j],ws[j-s]+w); if(vs[j-s]!=0 || j-s == 0) vs[j] = std::max(vs[j],vs[j-s]+w); } } ans[0] = ws[v]; ans[1] = vs[v]; return ans; } };