用于生成所有可能组合的代码

时间:2014-12-05 01:49:06

标签: java optimization combinations

如果我有3个苹果和2个桶,我可以按如下方式组织它们:

  • 桶A中的1个苹果和桶B中的2个苹果
  • 桶A中的2个苹果和桶B中的1个苹果
  • 桶A中的3个苹果和桶B中的0个苹果
  • 桶B中的3个苹果和桶A中的0个苹果

等。

我正在尝试制作某种程序,当苹果的数量可以是任意数量且桶的数量也可以是任何数字时,它将为我生成这样的组合。我的直觉告诉我将涉及一些递归但是,我甚至无法开始。有人能指出我正确的方向吗?

2 个答案:

答案 0 :(得分:1)

是的,可以使用递归来解决这个问题。

提示您入门:如果您拥有M个苹果和N存储桶,则可以通过将m <= M个苹果放入第一个存储桶找到解决方案的一个子集,然后使用(M - m) apple和N - 1存储桶查找子问题的所有解决方案。

答案 1 :(得分:1)

是的,您当然可以使用递归,它可以通过在堆中保存上下文来简化操作。但这并非绝对必要。

这里有一些(不是非常有效并且有很多东西丢失)如果您更喜欢这种方法,使用interation的伪代码可以让您在某个地方开始。下面的算法看起来有点反直觉,但如果你认为它通过你会看到它的工作原理。我已经尝试过它并且它完美无缺,所以让我知道如果你遇到困难我将发布一些工作代码。您可能还想尝试递归和迭代版本,看看哪一个对您更有意义。

put all apples in first bucket    
while (true) {
    add the solution to the list        
    firstNonEmptyBucket = find first bucket with any apples;
    if (firstNonEmptyBucket is the last bucket)
        break - you are finished
    shift 1 apple from firstNonEmptyBucket to next bucket
    if (firstNonEmptyBucket is not the first bucket)
        shift all apples from firstNonEmptyBucket to previous bucket
}