我需要找到以下问题的解决方案:
在约束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。我怎样才能找到这些?
答案 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;