我有不同颜色的球:
我想用Java编写一个算法来计算3种不同颜色的最大组合数。
例如,在这种情况下,可以使用多种解决方案,但我会查找最大组合数。在这个例子中有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);
}
}
}
}