C++ 派对日程-经典背包
输入是可用预算、派对数量、每个派对的票价以及派对的乐趣。任务是用可用预算和使用的预算输出最大可能的乐趣。如果你能在两个同样有趣的派对中进行选择,那就选一个更便宜的吧。(这是一个例子。) 我创建了两个阵列:C++ 派对日程-经典背包,c++,algorithm,knapsack-problem,C++,Algorithm,Knapsack Problem,输入是可用预算、派对数量、每个派对的票价以及派对的乐趣。任务是用可用预算和使用的预算输出最大可能的乐趣。如果你能在两个同样有趣的派对中进行选择,那就选一个更便宜的吧。(这是一个例子。) 我创建了两个阵列: m[i][j]是我和所有人在一起的最大乐趣 预算j p[i][j]py的最低价格,从派对中获得最大乐趣 截至i,预算j 然后,对于每个i至#缔约方和每个j至预算,我计算m[i][j]和p[i][j]的值,如下所示: for(T i = 1; i <= parties; i++) {
是我和所有人在一起的最大乐趣 预算jm[i][j]
py的最低价格,从派对中获得最大乐趣 截至i,预算jp[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];
}
}
}
for(ti=1;i我检查了您的完整代码,但没有检查您的逻辑,但肯定有一些错误点:
您将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%u\n”)
在我改变了你程序中的这4个“bug”之后,它被接受了:)所以你的算法逻辑被批准了,但是一些“不相关”的东西阻止了你被接受不要小看这些“细节”,它们很重要强>