背包 - 如何识别使用哪些重量?

时间:2012-09-27 10:26:31

标签: c++ knapsack-problem

我有一个代码,可以通过使用最佳权重集填充背包来获得最大值。

int arr[5] = {0, 0, 0, 0, 0};
int Weight[5] = {2, 5, 8, 7, 9};
int Value[5]  = {4, 5, 7, 9, 8};
const int n = 5;
const int maxCapacity = 20;

int maximum(int a, int b)
{
    return a > b ? a : b;
}

int knapsack(int capacity, int i)
{
    if (i > n-1) return 0;

    if (capacity < Weight[i])
    {
        return knapsack(capacity, i+1);
    }
    else
    {
        return maximum (knapsack(capacity, i+1),
                        knapsack(capacity - Weight[i], i+1) + Value[i]);
    }
}

int main (void)
{
    cout<<knapsack(maxCapacity,0)<<endl;
    return 0;
}

我需要通过打印来扩展此解决方案,所有权重都用于找到最佳解决方案。为此,我计划使用一个初始化为0的数组arr。每当使用一个权重时,我将arr中的相应位置标记为1,否则它将保持为0。

我想到的第一件事是更改max()函数,如下所示

int maximum(int a, int b, int i)
{
    if (a > b)
    {
        if (arr[i] == 1) arr[i] = 0;
        return a;
    }
    else
    {
        if (arr[i] == 0) arr[i] = 1;
        return b;
    }
}

但即使这种解决方案也失败了一些权重和价值观的组合。关于如何前进的任何建议?

1 个答案:

答案 0 :(得分:0)

问题是你不知道这个命令选择了哪两个选项

return maximum (knapsack(capacity, i+1),
                knapsack(capacity - Weight[i], i+1) + Value[i]);

我猜你可以使用两个变量来存储值,如果选择了权重(该变量的值更大),你可以将它添加到数组中。希望能解决你的问题。