派对时间表-经典背包
Party schedule - classical knapsack
输入的是可用预算、派对数量、每个派对的票价以及派对的乐趣。任务是用可用的预算和使用的预算输出最大可能的乐趣。如果你能在两个有同样乐趣的派对之间做出选择,那就选择更便宜的一个。(这是一个SPOJ问题。)
我创建了两个阵列:
m[i][j]
是从各方获得的最大乐趣预算jp[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];
}
}
}
对于我发现的任何测试用例(如果需要,我可以分享一些),该算法输出的答案与在线法官批准的算法相同。然而,这一点没有得到批准。
算法出了什么问题?
这是完整的程序。
我检查了你的完整代码,没有检查你的逻辑,但肯定有一些地方错了:
- 您将函数内部的
price
数组标记为price[parties]
,只允许使用price[0..parties - 1]
,但您最多使用了price[parties]
,与fun[]
相同 - 您的
while
的条件是while(scanf("%u %u",&budget,&parties), budget != 0 && parties != 0)
,但即使在有效输入中,budget
也可以是0
,因此您的程序可能会提前终止 - 您在函数内部声明了
m[][]
和p[][]
,但没有初始化它,所以它会被垃圾值填满 - 您使用
printf("%u %u")
打印答案,但问题需要每个输出都有一行新行,所以这里应该是printf("%u %un")
在我更改了你程序中的这4个"错误"后,它被接受了:)所以你的算法逻辑被批准了,但一些"无关"的事情阻止了你被接受不要轻视这些"细节",它们确实很重要
相关文章:
- 0-1背包代码中的错误.我的代码中有什么错误
- 分数背包边缘箱
- 具有多种约束(例如重量、体积等)的背包
- 背包问题,视觉工作室问题
- 分段故障背包问题
- 0-1 大重量背包
- 如何使用VB经典IDE在VB脚本中调试ActiveX应用程序
- Qt/C++ 连接到经典蓝牙设备
- 提升::精神(经典):|和^之间的区别?
- 您如何使用Winrt创建经典的Win32应用程序窗口
- C :用于体系结构错误的经典未定义符号
- C++UWP和经典桌面的通用Windows DLL
- 具有最小值和最大值的多维背包
- 使用经典重载解析规则创建依赖于 std::调用的重载集类
- 仅在使用间接寻址时调用虚函数 — 经典的早期绑定问题?
- 此背包代码显示浮点[float]无效类型错误.可能是什么原因
- 背包问题根据单位重量的利润对数组进行排序
- Python到C++:使用递归列出背包的所有组合的算法
- 蛮力背包的C 一部分
- 派对时间表-经典背包