2013-04-22 32 views
3

我想生成将导致特定枚举值的枚举字段的最短(或最短)可能组合之一。什么是最好的算法来完成这个?如何获得枚举标志值的最短表示?

例如,说我有枚举:

enum MyEnum 
{ 
    One = 1, 
    Two = 2, 
    Three = One | Two, 
    Four = 4, 
    Six = Two | Four, 
    Eight = 8, 
    All = One | Two | Four | Eight 
} 

现在例如该值7我想我的功能,无论是产量还是"One | Six""Three | Six"

编辑:当然Three | Four也是一个有效的输出。

+4

为什么“三|六”而不是“三|四”? – 2013-04-22 13:23:47

+0

@DanielHilgarth或者确实,'One |六' – 2013-04-22 13:25:17

+0

“为什么'三|六'” - 无论是打字错误,还是因为“三”和“六”共用“两个”标志并且不会重复该标志?后续问题,我感兴趣,这是什么? – 2013-04-22 13:25:38

回答

4

你基本上要求的是最小设置覆盖,一个已知的问题是NP完成。幸运的是,这并不意味着你不能解决这样的小问题。您也可以通过贪心算法获得近似值。

如果您的枚举值没有特定的结构,那么对于一般的精确解决方案,您将无法比蛮力做得更好。如果您知道您的枚举具有特定的结构,那么通常可以通过诸如图形分区或CSP +回溯等方式来得到更好的结果。

+2

这也是[“硬币问题”](http://en.wikipedia.org/wiki/Coin_problem)的一个特例,其中“硬币”的值分别为1,2,3,4,6,8和15? – 2013-04-22 13:35:31

+0

@Me:实际上,它更多是[“变更制作”](http://en.wikipedia.org/wiki/Change-making_problem)问题的特例。 – 2013-04-22 13:42:31

+0

@Matthew,这不是变化的问题,因为允许重叠。你正在采取按位或不添加。 – Antimony 2013-04-22 13:55:16