递归跟踪背包物品

时间:2013-06-26 03:25:21

标签: c++ recursion knapsack-problem

嘿伙计们,我对社区和这些东西都有点新意,所以这可能是一个简单的问题。

我正在研究c ++中的作业问题,我必须基本上编写一个背包问题的递归解决方案,并在最后列出背包中的项目。

这是问题

你来到一个充满宝藏的岛屿。拿走所有这些都很好,但你只能承受这么多的重量。您将编写一个程序来帮助选择宝藏,以便最大化所选宝藏的总价值。问题的输入是你可以携带的重量和一系列宝物,每个珍宝都由它的重量和价值来表示。输入格式如下所示;所有数字都是整数。输出是您可以带走的宝藏的最大值以及产生最大值的项目列表。 (注意:(1)每个项目可以采取或不采取,但不能切碎(或部分采取);(2)您应该首先编写一个程序来计算在枚举每个项目之前可以带走的最大值。 ) 您可以假设项目数不超过42个。

所以我认为我有解决问题的方法,但是我不能为我的生活弄清楚如何跟踪这些项目。我尝试简单地在一个数组中,然后每次我选择一个项目来标记相应的标志数组,但这不起作用。 请记住,它必须是递归的。

这是我到目前为止所拥有的。

int maxvalue(int N, int W[], int V[], int totalweight, int beg, int end)
{
    //base case
    if (beg > end) 
        return 0;


    if (totalweight < W[beg]) 
    {
        //not taken
        return maxvalue(N-1, W, V, totalweight, beg+1, end);
    }
    else 
    {
        //taken
        return max(V[beg] + maxvalue(N-1, W, V, totalweight - W[beg], beg+1, 
                        end), maxvalue(N-1, W, V, totalweight, beg+1, end) );
    }
}

在我看来,函数中的一些参数不是必需的,但是教授给了我们原型,所以我正在使用它。我想按照教授想要的方式完成任务,但这非常令人困惑。这就是他说我应该做的。

“int flag []在子程序中设置, 在此例程中,您需要为这两个选项声明两个标志数组 然后,您应该复制并返回正确的标志数组,并为第一个项目的选择设置正确的标志值。“

我真的不明白他要求我做什么,或者怎么做。我真的很喜欢这些人的帮助。谢谢!

0 个答案:

没有答案