背包DP如何查找总值?

时间:2011-12-16 17:26:56

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

就像

最大重量3

Value Weight 

1955    1
2000    5
101     1

取第一个和第三个。但找不到总价值。 1955 + 101。

我使用背包0-1。无论如何从阵列中找到1955 + 101

1 个答案:

答案 0 :(得分:0)

假设您有2个阵列 wt ,另有一个变量 initial_capacity < / strong>这是背包的最大容量。然后,您需要先调用 dp 函数,然后计算您可以实现的 maxValue reconstruct 函数会告诉您应该使用哪些项目来实现maxValue。

int dp(int position, int weight)
{
    if(position == no_of_items) return 0;
    if(mem[position][weight] != -1) return mem[position][weight];

    int r1 = dp(position + 1, weight);
    int r2 = dp(position + 1, weight - wt[position]) + value[position];

    return mem[position][weight] = max(r1, r2);
}

void reconstruct(int position, int weight)
{
    if(position == no_of_items) return;

    int r1 = dp(position + 1, weight);
    int r2 = dp(position + 1, weight - wt[position]) + value[position];

    if(r2 > r1)
    {
        cout << "Take item at position : " << position << endl;
        reconstruct(position + 1, weight - wt[position]);
    }
    else
    {
        reconstruct(position + 1, weight);
    }
}

int main()
{
    //read input here
    memset(mem, -1);
    int maxValue = dp(0, initial_capacity);
    cout << "Max value : " << maxValue << endl;
    reconstruct(0, initial_capacity);
}

请注意,重建以贪婪的方式运作。哪个决定(采取项目或跳过项目)导致maxValue,它将采取该决定。如果您的决定涉及拍摄特定项目,则打印该项目的索引。

希望这会有所帮助:)