【问题标题】:How to solve this knapsack with dynamic programming?如何用动态规划解决这个背包?
【发布时间】:2014-07-21 02:43:45
【问题描述】:

给定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)。

问题:如何用动态规划解决?

【问题讨论】:

标签: algorithm dynamic-programming


【解决方案1】:

我不明白你为什么要使用 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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多