【问题标题】:TLE in backpack problem using memoization使用记忆的背包问题中的 TLE
【发布时间】: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&lt;int,int&gt;

标签: c++ algorithm memoization


【解决方案1】:

考虑使用this 之类的方法创建两个整数mi 的哈希值 并将其用作地图中的键。尽管自下而上的解决方案更胜一筹,但您应该会看到运行时的改进。 在您的代码中,to_string 需要时间,而且查找字符串所需的时间比您想象的 cmets 中提到的要多。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-05
    • 1970-01-01
    • 2023-02-04
    • 2019-06-13
    • 2014-07-09
    • 2019-01-08
    • 1970-01-01
    相关资源
    最近更新 更多