动态规划——背包系列之装箱问题
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];
有一个箱子容量为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];
相关文章推荐
- 动态规划——背包系列之砝码称重
- 算法细节系列(9):动态规划之01背包
- 动态规划:背包问题(DP系列)
- 动态规划 || 威威猫系列故事——篮球梦 (类似背包)
- (转载)动态规划之背包问题(一)
- 利用0-1背包问题谈动态规划
- 动态规划0——1背包问题
- 动态规划——背包问题变形 收藏
- 动态规划——背包问题(二)
- 动态规划—0-1背包问题
- 动态规划系列问题-最长公共子串
- 动态规划解决背包问题
- 动态规划-背包问题0-1
- 动态规划之0-1背包问题(POJ3624)
- 100道动态规划——16 UVA 1627 Team them up! 二分图,背包,不过关键还是学会转化
- 动态规划初步-完全背包问题
- 动态规划01背包问题
- 动态规划0-1背包问题
- 杭电ACM OJ 1011 Starship Troopers 树的动态规划(树的dp)经典树形背包 java写的 包看懂 递归流程完全解析
- Codeforces Beta Round #82 (Div. 2)第三题:简单的动态规划——多重背包