背包问题(Knapsack problem)是一种组合优化的NP完全问题。问题可以描述为:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高。
一个背包的总容量为V,现在有N类物品,第i类物品的重量为weight[i],价值为value[i]
那么往该背包里装东西,怎样装才能使得最终包内物品的总价值最大。这里装物品主要由三种装法:
1、0-1背包:每类物品最多只能装一次
2、多重背包:每类物品都有个数限制,第i类物品最多可以装num[i]次
3、完全背包:每类物品可以无限次装进包内
我们有n种物品,物品j的重量为wj,价格为pj。
我们假定所有物品的重量和价格都是非负的。背包所能承受的最大重量为W。
可以用公式表示为:
如果限定物品j最多只能选择bj个,则问题称为有界背包问题。
可以用公式表示为:
如果不限定每种物品的数量,则问题称为无界背包问题。
各类复杂的背包问题总可以变换为简单的0-1背包问题进行求解。
无界背包问题例题见收藏
动态规划建模关键设置好以下变量:
- 阶段:第k阶段装载k种物品
- 状态变量xk:第k次装载时背包还可以装载的容量,0≤xk≤W
- 决策变量dk:第k次装载k种物品的数量
- 决策变量允许集合:Dk(xk) 0≤dk≤xk/wk
- 状态转移方程: xk+1=xk-dk*wk
- 阶段指标:vk=ck*dk
- 递推方程:fk(xk)(理解成每阶段最优收益函数)=max{ck*dk + fk+1(xk+1)}
- 边界条件:fn+1(xn+1)=0
思想:本阶段的决策会影响到下个阶段的状态变量,下一阶段的状态变量及对应的最优决策都已经求得,因此只用考虑本阶段状态根据指标函数确定最优决策