如何用动态编程解决这个背包?

时间:2014-07-21 02:43:46

标签: algorithm dynamic-programming

给定N个对象并且它们是1~n,第i个对象的音量为titi <= M;同时,有很多盒子,每个盒子的体积是M。现在我们应该将所有这些对象放入 1~N 的框中,应该使用最小数量的框?

例如,有5个对象,其体积为{7,2,5,3,9},顺序为1~5。每个盒子的体积是10.因此最佳解决方案是3个盒子,它们分别是{7},{2,5,3},{9}

我的解决方案:贪心算法。假设第i个对象的最优解是x个框被填充而剩余空间是y,那么对于i + 1对象,如果其体积大于y,则必须将其放入另一个新框中。否则,一个选项是将其放入当前框中,解决方案是(x,y-v);另一种选择是把它放到另一个新盒子里,解决方法是(x + 1,M-v)。

问题:如何使用动态编程解决它?

1 个答案:

答案 0 :(得分:0)

我不明白你为什么要用DP来解决它,因为你有一个非常好的贪心解决方案,但这是基于DP的想法:

F(k)成为第一个k个对象的答案 - 我们可以将它们放入最小的方框数。 让我们循环浏览最后一个框中放置的对象数量:

F(k) = min{F(l) + 1|l < k, t_(l+1) + t_(l+2) + .. + t_(k) <= M}
F(0) = 0

如果我们为每个O(N*N)动态计算t_i的总和,则复杂度为k