派对时间表 - 古典背包

时间:2014-08-31 22:44:11

标签: c++ algorithm knapsack-problem

输入是可用预算,参与方数量,各方的门票价格以及派对上的乐趣。任务是使用可用预算和使用的预算输出最大可能的乐趣。如果您可以选择两个有相同乐趣的派对,请选择更便宜的派对。 (这是一个SPOJ problem。)

我创建了两个数组:

  • m[i][j]是从各方到我的最大乐趣 预算j
  • p[i][j] py的最低价格以获得最大值。来自派对的乐趣 直到我与预算j

然后,对于每个i到#parties以及每个j到预算,我计算了m[i][j]p[i][j]的值,如下所示:

for(T i = 1; i <= parties; i++) {
    for(T j = 0; j <= budget; j++) {
        //We get more fun by attending party i
        if(price[i] <= j && m[i-1][j-price[i]] + fun[i] > m[i-1][j]) {
            m[i][j] = m[i-1][j-price[i]] + fun[i];
            p[i][j] = p[i-1][j-price[i]] + price[i];
        //We get same fun by attending i, but more cheaply
        } else if(price[i] <= j && m[i-1][j-price[i]] + fun[i] == m[i-1][j] && p[i-1][j-price[i]] + price[i] < p[i-1][j]) {
            m[i][j] = m[i-1][j-price[i]] + fun[i];
            p[i][j] = p[i-1][j-price[i]] + price[i];
        //We can't visit the party
        } else {
            m[i][j] = m[i-1][j];
            p[i][j] = p[i-1][j];
        }
    }
}

对于我发现的任何测试用例(如果需要,我可以分享一些),此算法输出与在线评判批准的算法相同的答案。但是,这个没有被批准。

算法出了什么问题?

Here是完整的计划。

1 个答案:

答案 0 :(得分:2)

我检查了你的完整代码而没有完成你的逻辑,但是有一些必须要错的点:

  1. 您将price内部的数组标记为price[parties],仅允许price[0..parties - 1],但最多使用price[parties],与fun[]相同; < / LI>
  2. while的条件为while(scanf("%u %u",&budget,&parties), budget != 0 && parties != 0),但budget即使在有效输入中也可0,因此您的程序可能会提前终止;
  3. 您在内部功能中声明了m[][]p[][]但未对其进行初始化,因此会填充垃圾值;
  4. 您使用printf("%u %u")打印答案,但问题需要为每个输出添加一行,因此此处应为printf("%u %u\n")
  5. 我改变了这些4&#34;错误&#34;在你的程序中,它被接受:)所以你的算法逻辑被批准,但有些&#34;无关紧要&#34;事情阻止你被接受。 不要小看这些&#34;详细信息&#34;,他们会计算!