派对时间表-经典背包

Party schedule - classical knapsack

本文关键字:背包 经典 时间表 派对      更新时间:2023-10-16

输入的是可用预算、派对数量、每个派对的票价以及派对的乐趣。任务是用可用的预算和使用的预算输出最大可能的乐趣。如果你能在两个有同样乐趣的派对之间做出选择,那就选择更便宜的一个。(这是一个SPOJ问题。)

我创建了两个阵列:

  • m[i][j]是从各方获得的最大乐趣预算j
  • p[i][j]最低价格到py,从派对中获得最大乐趣预算为j的上限为i

然后,对于每个i到#方,以及每个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];
        }
    }
}

对于我发现的任何测试用例(如果需要,我可以分享一些),该算法输出的答案与在线法官批准的算法相同。然而,这一点没有得到批准。

算法出了什么问题?

这是完整的程序。

我检查了你的完整代码,没有检查你的逻辑,但肯定有一些地方错了:

  1. 您将函数内部的price数组标记为price[parties],只允许使用price[0..parties - 1],但您最多使用了price[parties],与fun[]相同
  2. 您的while的条件是while(scanf("%u %u",&budget,&parties), budget != 0 && parties != 0),但即使在有效输入中,budget也可以是0,因此您的程序可能会提前终止
  3. 您在函数内部声明了m[][]p[][],但没有初始化它,所以它会被垃圾值填满
  4. 您使用printf("%u %u")打印答案,但问题需要每个输出都有一行新行,所以这里应该是printf("%u %un")

在我更改了你程序中的这4个"错误"后,它被接受了:)所以你的算法逻辑被批准了,但一些"无关"的事情阻止了你被接受不要轻视这些"细节",它们确实很重要