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

装箱问题

有一个箱子容量为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];

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值