就像
最大重量3
Value Weight
1955 1
2000 5
101 1
取第一个和第三个。但找不到总价值。 1955 + 101。
我使用背包0-1。无论如何从阵列中找到1955 + 101
答案 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,它将采取该决定。如果您的决定涉及拍摄特定项目,则打印该项目的索引。
希望这会有所帮助:)