连续的物品必须放在几辆卡车上。给出了物品的重量和卡车的数量及其共同容量。物品只能从排的两端移动到卡车上。我们如何确定可放入卡车的最大物品数量? (最多可以有10000件物品和100辆卡车。)
示例:
项目:(20,70,10,30,80,60,50,30)
卡车数量:3
卡车容量:100
这里我们可以放置最多7件商品,例如像这样:
item to truck remaining
20 1 (70, 10, 30, 80, 60, 50, 30)
30 2 (70, 10, 30, 80, 60, 50)
70 2 (10, 30, 80, 60, 50)
50 1 (10, 30, 80, 60)
10 3 (30, 80, 60)
30 1 (80, 60)
60 3 (80)
我的想法是尝试尽可能地填满所有卡车,但包装问题对我来说很新,我对它们知之甚少。
答案 0 :(得分:0)
问题确实可以通过动态编程来解决;然而,如果没有以前的经验,这可能是困难的。递归关系和状态空间可以定义如下。
让n
表示项目数量,i_1,...,i_n
表示其大小;让m
表示卡车的数量,让c_1,...,c_m
表示他们的能力。状态空间可以实现为m+2
维度表,其中位置(k_1,k_2,l_1,...,l_m)
的条目被定义为从项{k_1,...,k_2}
的补集中选择的最大可能项目数(其中然后是卡车k
剩余负荷恰好为l_k
的剩余货物队列,或者没有此类解决方案存在负面影响。在初始化对应于基本情况的状态之后,可以使用递归关系
(k_1,k_2,l_1,...,l_m) = max
{
(k_1+1,k_2,l_1,...,l_m),
(k_1,k_2+1,l_1,...,l_m),
(k_1+1,k_2,l_1-i_k_1,...,l_m) + 1, m cases in total
...,
(k_1+1,k_2,l_1,...,l_m-i_k_1) + 1,
(k_1,k_2-1,l_1-i_k_2,...,l_m) + 1, m cases in total
...,
(k_1,k_2-1,l_1,...,l_m-i_k_2) + 1,
}
其中前两种情况对应于丢弃队列的左端和右端,下一个m
个案例对应于将队列左端的项目打包到每个m
卡车和最后m
个案件对应于将队列右端的物品打包到每辆m
卡车。
评估状态空间后,必须检查所有最终状态;这些是每件物品都被包装或丢弃的物品。这些状态是k_1 = k_2-1
保持的状态,即队列为空。实施将采用这些的最大值;如果结果是负无穷大,则不存在可行的解决方案。