输入是可用预算,参与方数量,各方的门票价格以及派对上的乐趣。任务是使用可用预算和使用的预算输出最大可能的乐趣。如果您可以选择两个有相同乐趣的派对,请选择更便宜的派对。 (这是一个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是完整的计划。
答案 0 :(得分:2)
我检查了你的完整代码而没有完成你的逻辑,但是有一些必须要错的点:
price
内部的数组标记为price[parties]
,仅允许price[0..parties - 1]
,但最多使用price[parties]
,与fun[]
相同; < / LI>
while
的条件为while(scanf("%u %u",&budget,&parties), budget != 0 && parties != 0)
,但budget
即使在有效输入中也可0
,因此您的程序可能会提前终止; m[][]
和p[][]
但未对其进行初始化,因此会填充垃圾值; printf("%u %u")
打印答案,但问题需要为每个输出添加一行,因此此处应为printf("%u %u\n")
。我改变了这些4&#34;错误&#34;在你的程序中,它被接受:)所以你的算法逻辑被批准,但有些&#34;无关紧要&#34;事情阻止你被接受。 不要小看这些&#34;详细信息&#34;,他们会计算!