Ruby 船舶尺寸组合

Ruby 船舶尺寸组合,ruby,algorithm,list,grouping,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]],

我有一系列的产品要发货,我需要找出最便宜的价格

考虑到一批不同尺寸的货物,比如[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左右


提前谢谢

看看这里和这里可能会很有启发性……

对于
N我想您想生成

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

对于
n
,有这样的事情


我认为你有一个并且是解决这个问题的正确方法。

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

在数组大小为7的情况下,您得到了7!为5040的组合。这听起来像是一个P到NP的问题。
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 )