gpt4 book ai didi

c - 动态规划递归给出错误结果

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:25:32 25 4
gpt4 key购买 nike

我正在尝试解决背包问题的一个变体,并为其编写了一个递归解决方案。但我的解决方案是返回一个错误的值。我想我的算法有缺陷。你能帮我找到故障吗。

这是我的代码。

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]);
}

}

问题的目标:通过最佳地使用给定的最大预算找到最大的乐趣

以下是我的输入。

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 找到的基本框架。这个算法是有缺陷的还是我弄错了。

谢谢

奇丹巴拉姆

最佳答案

问题是在通话过程中calc_budget(b, i)你写了 tbl 的字段对于除 [b][i] 以外的其他指数.我将尝试使用 calc_budget(b, i) 的递归定义来解释这个问题。 .

我们从定义递推关系开始。让F(b, i)成为聚会的最大乐趣i, ..., n和最大预算 b .然后,

F(b, n+1) = 0
F(b, i) = F(b, i+1) // if budget[i] > b
= max( F(b, i+1), fun[i] + F(b - budget[i], i+1) ) // otherwise

到目前为止一切顺利。 calc_budget(b, i)应该准确计算这个数字,它应该使用 tbl作为已计算值的缓存。换句话说,在第一次调用 calc_budget(b, i) 之后制成,tbl[b][i] == F(b, i)一定是真的。

下面是一些实现此目的的伪代码:

initialize tbl[b][i] = -1 for all b, i.

def calc_budget(b, i):
if tbl[b][i] != -1: return tbl[b][i]

if i == n + 1:
tbl[b][n+1] = 0
else:
if budget[i] > b:
tbl[b][i] = calc_budget(b, i+1)
else:
tbl[b][i] = max(
calc_budget(b, i+1),
fun[i] + calc_budget(b - budget[i], i+1)
)

return tbl[b][i]

我希望你现在同意自tbl实际上只是一个已计算值的缓存,写成这样似乎很奇怪tbl[b-budget[i]][i]在调用 calc_budget(b, i) .

关于c - 动态规划递归给出错误结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15925162/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com