【发布时间】:2020-08-10 19:25:24
【问题描述】:
问题陈述: 给定 n 个大小为 Ai 的物品,整数 m 表示背包的大小。这个背包你能装多少?
示例 示例 1: 输入:[3,4,8,5],背包尺寸=10 输出:9
示例 2: 输入:[2,3,5,7],背包尺寸=12 输出:12
我必须使用 memoization 编写解决方案,我知道自下而上的 dp 会很快,但是你能帮我解决我可以在这个解决方案中添加的其他优化吗?
class Solution {
public:
unordered_map<string,int>m1;
int solve(int m,vector<int>&a,int i){
if(i<0)return 0;
string s = to_string(m)+" "+to_string(i);
if(m1.count(s))return m1[s];
int val=0;
if(m-a[i]>=0)val = a[i] + solve(m-a[i],a,i-1);
return m1[s]=max(val,solve(m,a,i-1));
}
int backPack(int m, vector<int> &a) {
// write your code here
return solve(m,a,int(a.size()-1));
}
};
【问题讨论】:
-
使用数组代替地图
-
所有这些字符串构建所花费的时间比您想象的要多。使用
std::pair<int,int>。
标签: c++ algorithm memoization