您的位置:首页 > 其它

动态规划——背包系列之装箱问题

2011-08-23 16:20 246 查看
装箱问题

有一个箱子容量为maxv(正整数,0≤maxv≤20000),同时有n件物品(0≤n≤30),每件物品有一个体积vi(正整数) 。要求从这n件物品中任取若干件装入箱内,使箱子的剩余空间最小。

分析

这是一个最简单的背包问题,只需要考虑选取哪几个物品放入箱子,可以使得剩余体积最小。

这道题的基础做法当然还是穷举放进背包的物品编号。若我们把取该物品记为0,不取该物品记为1,那么使用某种放入方式将对应一个2进制串,因此这类问题也被称为01背包问题.

然而我们不从物品角度考虑,而是从体积角度考虑的话,就会发现,这个问题还可以被描述为,w[i]的体积是否能用这些物品达到。

状态的确定

我们用opt[i][j](布尔)表示前 i 个物品是否能达到 j 体积。则opt[i,j]的值取决于前 i-1 个物品能否达到 j 体积,或者是 前 i-1 个物品能否达到 j-v[i](i 的体积)体积

则有opt[i,j]:=(opt[i-1,j-v[i]])or(opt[i-1,j])

初值为opt[0,0]:=true;其他都为false

Fillchar (opt,sizeof(opt),false);

Opt[0][0]:=true;

For i:=1 to n do

for j:=maxv downto 0 do     //这里是这个问题的关键

if j>=v[i] then

opt[i,j]:=(opt[i-1,j])or(opt[i-1,j-v[i])

当然这里也是可以变为一维数组。opt[j]=opt[i-1,j-v[i]   {opt[i-1,j-v[i]==true}

else

opt[i,j]:=opt[i-1,j];
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: