我正在尝试解决背包问题的一个变体,并为它编写了一个递归解决方案。但我的解决方案是返回错误的值。我想我的算法有缺陷。你能帮我找出故障吗?
这是我的代码。
int calc_budget(int b, int i){
// If we have reached the end
if(i >= nParty){
tbl[b][i] = 0;
return tbl[b][i];
}
//If remaining capacity is not able to hold the ith capacity, move on to next element
if(budget[i] > b){
if(tbl[b][i+1] == 0){
tbl[b][i+1] = calc_budget(b,i+1);
}
return tbl[b][i+1];
}
else{ //If the ith capacity can be accomodated
//Do not include this item
if(tbl[b][i+1] == 0){
tbl[b][i] = calc_budget(b,i+1);
}
// Include this item and consider the next item
if(tbl[b-budget[i]][i+1] == 0){
tbl[b-budget[i]][i] = fun[i] + calc_budget(b-budget[i], i+1);
}
// We have the results for includinng ith item as well as excluding ith item. Return the best ( max here )
return max(tbl[b][i], tbl[b-budget[i]][i]);
}
}
Objective of the problem: To find the maximum fun by optimally using the given max budget
以下是我的输入。
budget[3] = {19,12,19}
fun[3] = {2,4,5}
calc_budget(30,0)
allowed budget: 30
该程序的正确答案应该是 5。我的返回 7。我已经绘制了递归树以尝试调试。我的发现:在选择项目 0(右子树)时,val = 2 + (11,1)。这 (11,1) 将导致最大值( (11,2) 和 0 )。(11,2) 是 5,所以最终结果是 2+5 = 7。在这种 DP 技术中,我的算法不应该选择 11,2,因为预算总和超过了给定的。但这是我为递归 DP 找到的基本框架。这个算法有缺陷还是我弄错了。
谢谢
奇丹巴拉姆