出于好奇,我写了一个程序来计算产生一定分数的不同数量的滑雪球角色组合。这些孔的值为[0,10,20,30,40,50,100],它们作为枚举值保存。还有九个球卷。我将每个卷处理为递归调用下一个卷,同时循环遍历每个卷的值:
private static void scoreCalc(int targetScore, int score, int ballNumber)
{
for(SkiBallHoles hole : SkiBallHoles.values())
{
score += hole.getValue();
ballNumber--;
if (ballNumber > 0) {
scoreCalc(targetScore, score, ballNumber);
}
if (ballNumber == 0 && score == targetScore) {
frequency++;
}
ballNumber++;
score -= hole.getValue();
}
}
分数本身从主函数中的for循环传递给此函数,进入一系列设置函数:
while(score <= 900){
writer.println(calculateFrequency(score));
score += 10;
}
private static String calculateFrequency(int targetScore)
{
frequency = 0;
scoreCalc(targetScore);
return targetScore + ": " + frequency;
}
private static void scoreCalc(int targetScore)
{
scoreCalc(targetScore, 0, BALLCOUNT);
}
这种方法的问题在于,不计算唯一解决方案的数量。即,0 0 0 0 0 0 0 0 10被计为与10 0 0 0 0 0 0 0 0不同,而它们实际上是相同的值组合以产生分数。
如何修改我的方法以仅计算唯一解决方案?
谢谢=)
答案 0 :(得分:1)
通过按值对洞进行排序,您只能对已排序的解决方案(0 0 0 0 0 0 0 0 10
,0 0 0 0 0 0 0 10 20
等)进行迭代。
您的解决方案是否针对同一个孔的不同排列进行迭代? (即0 0
迭代两次)如果是这样,你可以将结果除以n!。然而,这种方法会更慢。
答案 1 :(得分:0)
谢谢@ omer681,你指出了我正确的方向。
我的修复涉及将数值中的孔值从枚举更改为整数。然后,在递归中,传递'itter'int,其中for循环将开始。在递归中,此数字是从for循环继承的。这样,for循环中的每个步骤都将限制下面循环中的步骤数。这适用于任意数量的球和刻痕孔。
private static void scoreCalc(int targetScore, int score, int ballNumber,
int itter)
{
for(int i = itter; i < HOLEVALUES.length; i++)
{
...
if (ballNumber > 0) {
scoreCalc(targetScore, score, ballNumber, i);
...
}
}
private static void scoreCalc(int targetScore)
{
scoreCalc(targetScore, 0, BALLCOUNT, 0);
}