我有一个产品有一个ID和一个数量的列表,我需要找到一个产品组合的列表,将填补一定的数量。找到对象的唯一排列
E.g.
ProductID | Quantity
1 | 5
2 | 5
3 | 8
4 | 15
如果我需要的15量,然后我想有以下组合列表:
Products: {1, 2, 3}, {1, 3, 2}, {1, 2, 4}, {1, 3, 4}, {1, 4}
{2, 1, 3}, {2, 1, 4}, {2, 3, 1}, {2, 3, 4}, {2, 4}
{3, 1, 2}, {3, 1, 4}, {3, 2, 1}, {3, 2, 4}, {3, 4}
{4}
这几乎是一个排列,但它筛选出来的总结比多个条目什么是必须的。我需要停止采取更多的项目,如果在任何时候,目前的总数值超过15。这样做,如果我有所有的排列组合,那么我将有24个结果,如果我拿产品4,那么我就不需要把它和任何东西结合起来。同样,如果我拿到产品1然后拿4产品,我不需要再拿起产品,因为总和已经超过了15( 5 + 15 = 20)。
我能够通过获取所有排列(例如here),然后将其过滤为我关心的排列,但是一旦开始获得大量产品(例如30),您最终会有43亿个组合导致了内存不足的例外。
如何在C#中只创建所需的排列?
您可能想通过https://stackoverflow.com/questions/tagged/knapsack-problem和对应问题的其他文章/研究... –
根据您的问题[{1,2, 3},{1,3,2},{2,3,1},{2,1,3},{3,2,1},{3,1,2}]这6个组合不应该在那里因为他们中的任何一个对你都有好处? –
@AmanSahni - 我想要所有的组合。基本上是说我应该取1,2和3的全部,或者全部的1,3和2的全部,或者全部的2,3和全部的1,等等。 – Greg