01背包
我在网上看到些资料关于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背包算法的源代码:
大家告诉我哪里错了?????
定义函数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);
...
}
}
大家告诉我哪里错了?????
...全文
相关推荐
背包之01背包、完全背包、多重背包详解.
首先,我们来了解01背包问题。01背包问题的名字来源于每个物品只能选择放入背包(1)或不放入(0)。
背包问题详解(01背包,完全背包,多重背包,混合背包,二维费用背包……)
**混合背包问题**:结合了01、完全和多重背包的特点,需要灵活处理不同类型的物品限制。5.
01背包问题_01背包问题_
通过分析压缩包中的"01背包问题"文件,我们可以期待找到一个具体实现01背包问题的代码示例,它可能包含对上述概念的清晰解释和实际的代码实现,帮助我们理解和应用01背包问题的动态规划解决方案。
分支限界算法 01背包问题
在解决01背包问题时,分支限界法是一种非常有效的方法。
01背包问题穷举法
**01背包问题定义**01背包问题得名于每个物品只能被完全放入或完全排除,即每种物品的数量是“0”或“1”,不能分割。


