使用不同项目的不同组合

时间:2016-04-02 09:44:23

标签: java algorithm combinations

我有不同颜色的球:

  • 1 red,
  • 1 white,
  • 5个橘子,
  • 2 black,
  • 0绿色。

我想用Java编写一个算法来计算3种不同颜色的最大组合数。

例如,在这种情况下,可以使用多种解决方案,但我会查找最大组合数。在这个例子中有2个:

  • (1个红色,1个橙色,1个黑色)
  • (1白色,1橙色,1黑色)

你能建议我一个解决方案吗? 谢谢!!!

2 个答案:

答案 0 :(得分:2)

在每个阶段,只需挑选你最常用的3种颜色。

例如,假设您有2个红色,3个绿色,7个蓝色,1个黄色和4个白色。

你应该先选择蓝色,白色和绿色,因为7,4和3是最大的数字。

然后你有2个红色,2个绿色,6个蓝色,1个黄色和3个白色。

6,3和2是最大的数字,所以你应该选择蓝色,白色和红色/绿色(如果选择红色或绿色则无关紧要)。

继续这样做,直到剩下少于3种颜色,你会找到最大颜色。

此算法有效的正式证据非常复杂,可以找到here

答案 1 :(得分:0)

这种强力求解算法(在java中)完成了这项工作。它缓慢但可靠:

    package combinations;

    import java.util.HashMap;
    import java.util.Map;

    public class Combinations {

        private static Map<String, Integer> balls = new HashMap<String, Integer>();

        private static int maxCombinationsCount = 0;

        public static void main(String[] args)
        {
            // init
            balls.put("red",  1);
            balls.put("white", 1);
            balls.put("orange", 5);
            balls.put("black", 1);
            balls.put("green", 0);
            // begin calculation
            combine(0, 0);

            System.out.println(maxCombinationsCount);
        }

        public static void combine(int combinationCount, int combinationsCount)
        {
            for (String ball: balls.keySet()) {
                if (balls.get(ball) > 0) {
                    balls.replace(ball, balls.get(ball) - 1);
                    combinationCount ++;
                    if (combinationCount == 3) {
                        maxCombinationsCount = Math.max(maxCombinationsCount, combinationsCount + 1);
                        combine(0, combinationsCount + 1);
                    }
                    else {
                        combine(combinationCount, combinationsCount);
                    }
                    combinationCount --;
                    balls.replace(ball, balls.get(ball) + 1);
                }
            }
        }

    }