运输尺寸组合

时间:2010-04-13 06:22:02

标签: ruby algorithm list grouping

我有一堆尺寸可以发货的产品,我需要找出最便宜的价格。

鉴于货物是用尺寸制造的,比如说[1,3,3,5]我需要决定如何运输 - 所有这些都是一起或分开的。然而,它并不像[1,3,3,5]或1& 3& 3& 5,我需要所有可能的组合,如:

[
[[1,3,3,5]],           ( 1 shipment )
[[1],[3,3,5]],         ( 2 shipments )
[[1,3],[3,5]],         ( 2 shipments )
[[1,3,3],[5]],         ( 2 shipments )
[[1,5],[3,3]],         ( 2 shipments ) 
[[1,3],[3],[5]],       ( 3 shipments )
[[1],[3],[3],[5]]      ( 4 shipments )
]

(等等 - 我假设更多) 我已尝试过facets gem的组合,但这并不是我所追求的,而且我不确定如何解决这个问题。据我所知,如果我知道这个名字,它可能有一个名字和解决方案:)

我知道可能有很多组合,但最初的大小数组不会大于7。

提前致谢!

4 个答案:

答案 0 :(得分:5)

我想你想要生成 the partitions of a set

Here is very good explanation and working code to do it.

但这样做并不是一个好主意,因为它会导致 Combinatorial Explotion

nalt text个问题。

我认为您有 knapsack problem dynamic programming是解决问题的正确方法。

答案 1 :(得分:1)

答案 2 :(得分:1)

对于N <= 7,您可以简单地详尽无遗:

在带有位掩码的C-ish伪代码中:

result = ()
subsets( int x, list current )
    if ( x == 0 )
        result.append( current )

    for ( int i = x; i >= 0; i = ( ( i - 1 ) & x ) )
        subsets( x ^ i, append i to current )

其中“将i追加到当前”意味着获取索引,将其放入列表并附加它。如果你想玩优化,你甚至可以记住它。

答案 3 :(得分:0)

这个问题在组合优化文献中被称为可变大小的装箱问题。由于它概括了Bin Packing,它是NP难的,但是像分支和绑定这样的技术应该在太大而无法用暴力处理的实例上做一个合理的工作。