01背包

chuengchuenghq chuengchuenghq 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
我在网上看到些资料关于O1背包的推倒:
定义函数f(i,j)为在1~i 件物品中选若干件装入限重为 j 的背包中的最大价值和, 那么根据上面关于第 i 件物品是否装入了背包的情况分析,我们得出关系式:
(1)当第I件物品要装入背包时,f(i,j) := (i-1件物品,限重为j-w[i]的最优解)+ v[i], 即: f(i,j) := f(i-1, j-w[i]) + v[i]
当然,第i件物品要装入是有条件限制的:第i 件物品重量小于等于背包限重,即 w[i] <= j
(2)当第i件物品不装入背包时,f(i,j) :=i-1件物品,限重为m的最优解,即: f(i,j) := f(i-1, j)
求得装入或者不装入第 i 件物品的限重为J的背包的最大价值,只需要比较这两种情况下谁的价值更大,更大者为当前问题的最优解。
f(i,j)=max{ f(i-1, j-w[i]) + v[i] , f(i-1, j) } 该方程递归结束的边界条件是:当j=0时,f(i,0)=0。


但是在软件设计师教程(不是最新)中关于01背包算法的源代码:

void find(int i , double tw , double tv)
{
int k;
if( tw + a[i].weight <= MAXWEIGHT) //选择I到当前方案
{
...
find( i + 1 , tw + a[i].weight , tv); // 这里tv总价值我的理解选择i时,推倒到i-1时候
//应该find( i + 1, tw+a[i].weight , tv - a[i].value)
...
}

if(tv - a[i].value > maxv)
{
...
find(i + 1 , tw , tv - a[i].value);//这里我觉得是 find(i + 1, tw, tv);
...

}


}



大家告诉我哪里错了?????
...全文

相关推荐

评论 10
收藏 已收藏
分享
返回顶部