【问题标题】:0-1 Knapsack for large weights0-1 大重量背包
【发布时间】:2020-05-14 14:38:20
【问题描述】:

我正在尝试解决大重量问题的 0-1 背包。问题的约束是:

  1. *输入中的所有值都是整数。
  2. $$1 \leq N \leq 100$$
  3. $$1 \leq W \leq 10^9$$
  4. $$1 \leq w_i \leq W$$
  5. $$1 \leq v_i \leq 10^3*$$

以下是我用 cmets 编写的代码。

#include <vector>
#include <algorithm>
#include <climits>
using namespace std;

const int V = 1e5;
const int N = 100;

int main() {
    int n, w, inp1, inp2, max_val = -1;
    vector<pair<int, int>> arr;
    cin >> n >> w; // n - no of items, w - total weight that the knapsack can hold
    for(int i = 0; i < n; i++){
        cin >> inp1 >> inp2; // ith input : w_i v_i
        arr.push_back({inp1, inp2});
        max_val = max(max_val, inp2); // storing maximum value of an item from the inputs
    }
    unsigned long long int dp[N + 1][V + 1]; // dp[i][j] = min weight that can be obtained from items 0..(i - 1) having total value atmost j 
    for(int i = 0; i <= n; i++){
        for(int j = 0; j <= (max_val * n); j++){
            if(i == 0 || j == 0)
                dp[i][j] = ULLONG_MAX;
            else if(j >= arr[i].second)
                dp[i][j] = min(dp[i - 1][j], dp[i - 1][j - arr[i - 1].second] + arr[i - 1].first);
            else
                dp[i][j] = dp[i - 1][j];
        }
    }
    for(int i = 0; i <= n; i++){
        for(int j = 0; j <= (max_val * n); j++)
            cout << dp[i][j] << " ";
        cout << endl;
    }
    int i; 
    for(i = (max_val * n); i >= 1; i--){
        if(dp[n][i] != ULLONG_MAX && dp[n][i] <= w)
            break;
    }
    cout << i;
    return 0;
}

但我没有得到所有输入的正确答案。例如,对于输入

3 8
3 30
4 50
5 60

我得到 180 作为答案,而 90 是准确的答案。请帮我解决它。

【问题讨论】:

    标签: c++ dynamic-programming knapsack-problem


    【解决方案1】:

    当权重可以为 10^9 时,您正在使用二维数组, 你的代码的复杂度是 O(n*w)。 所以这将在其他情况下给出 TLE。 使用 unordered_map 进行记忆。

    【讨论】:

    • 其实,记忆对你没有帮助,记忆的时间复杂度仍然是 O(n * W) 并且它肯定会给你 OJs 中的 TLE。更好的是更改 dp 状态定义,找到这篇有解释的文章,所以参考这个 - geeksforgeeks.org/knapsack-with-large-weights
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-16
    • 1970-01-01
    • 1970-01-01
    • 2011-12-28
    • 2013-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多