找到最佳解决方案的路径unboundeed背包

时间:2018-02-27 19:59:14

标签: algorithm dynamic-programming knapsack-problem

我需要找到以下问题的解决方案:

  

在约束W <= W_max

下,最大化W = sum({n_k * v_k})相对于n_k

这似乎是无界背包问题的变种。我有以下DP方法(用C ++编写):

auto findSize(int n_vals, int capacity, const int* values, int** mem)
    {
    if(n_vals == 0)
        {return 0;}
    if(capacity == 0)
        {return 0;}
    auto n = mem[n_vals - 1][capacity - 1];
    if(n != -1)
        {return n;}

    auto max_result = 0;
    auto k = 0;
    while(k*values[n_vals - 1] <= capacity)
        {
        auto val = k*values[n_vals - 1] + findSize(n_vals - 1, capacity - k*values[n_vals-1], values, mem);
        if(val > max_result)
            {max_result = val;}
        ++k;
        }
    mem[n_vals - 1][capacity - 1]=max_result;
    return max_result;
    }

我想我得到了正确答案,但我只得到N.我也想要不同的n_k。我怎样才能找到这些?

1 个答案:

答案 0 :(得分:0)

通常,要记录最佳路径,您必须在选择最佳下一步时记住源坐标(将其写入附加存储阵列prev,与mem并行)。

也许是这样的:

 if(val > max_result)
        {max_result = val;
         bestK = k}
...
mem[n_vals - 1][capacity - 1]=max_result;
prev[n_vals - 1][capacity - 1] = bestK;