目录
- 01背包问题简介
- 详细说明
- 状态转移方程详解
- 举例
- 代码块
- 测试结果
01背包问题简介
0-1背包问题:给定n种物品和一背包。物品i的重量是wi,其价值为vi,背包的容量为C。问:应该如何选择装入背包的物品,使得装入背包中的物品的总价值最大?
在选择装入背包的物品时,对每种物品i只有两种选择,即装入背包或不装入背包。不能将物品i装入背包多次,也不能只装入部分的物品i。因此,该问题称为0-1背包问题。
详细说明
01背包的状态转换方程 c[i,j] = max{ c[i-1,j-w[i]]+p[i]( j >= w[i] ), c[i-1,j] }
c[i,j]表示在前i件物品中选择若干件放在承重为 j 的背包中,可以取得的最大价值。
问题分析:令c(i,j)表示在前i(1<=i<=n)个物品中能够装入容量为就j(1<=j<=C)的背包中的物品的最大价值,则可以得到如下的动态规划函数:
(1)
- c(i,0)=c(0,j)=0
(2)
- c(i,j)=c(i-1,j) (j小于wi)
- c(i,j)=max{c(i-1,j) ,c(i-1,j-wi)+pi) } ( j>wi)
(1)式表明:如果第i个物品的重量大于背包的容量,则装入前i个物品得到的最大价值和装入前i-1个物品得到的最大价都是相同的,即物品i不能装入背包。c(i,0)=c(0,j)=0表示第i个物体装入容量为0的背包或者第0个物体装入容量为j的背包的价值都是0
(2)式表明,如果第i个物品的质量小于背包的容量,则会有一下两种情况:
(a). 如果把i个物品装入背包,则背包物品的价值等于第i-1个物品装入容量为j-wi的背包中的价值加上第i个物品的价值p。
(b).如果第i个物品没有装入背包,则背包中物品的价值就等于把前i-1个物品装入容量为j放入背包中所取得的价值。显然取2者中价值最大的作为前i个物品物品装入容量为j放入背包中的最优值。
状态方程详解
由表达式中各个符号的具体含义可得:
w[i]:第i个物体的重量
p[i]:第i个物体的价值
c[i][j]:第i个物体放入容量为j的背包的最大价值
c[i-1][j]:前i-1个物体放入容量为j的背包的最大价值
c[i-1][m-w[i]]:前i-1个物体放入容量为m-w[i]的背包的最大价值
因此状态方程:c[i][j]= max{c[i-1][j],c[i-1][j-w[i]]+p[i]}
解释:第一种是第i件放不进去,这时所得价值为c[i-1][j];第二种是第i件放进去,这时所得价值为c[i-1][j-w[i]](第二种是什么意思?就是如果第i件放进去,那么容量j-w[i]里就要放