Java 如何计算其组合值等于输入数的骰子总数
我应该为掷6个骰子(6张脸)的骰子游戏用Java做一个分数计算器。分数应该根据用户可用的选项列表进行计算。选项为4,5,…,12。对于选项“4”,所有值等于4的骰子组合都会得到分数Java 如何计算其组合值等于输入数的骰子总数,java,algorithm,dice,Java,Algorithm,Dice,我应该为掷6个骰子(6张脸)的骰子游戏用Java做一个分数计算器。分数应该根据用户可用的选项列表进行计算。选项为4,5,…,12。对于选项“4”,所有值等于4的骰子组合都会得到分数 在得分过程中,每个骰子只能选择一次。哪一个骰子组合在一起并不重要,只要它们的总和等于选择值,并且点数的总值最大化。 例如,如果用户选择选项“4”([13]+[4]+[2]+[2]),滚动{1 2 2 3}得到12分。如果用户选择选项“11”,则得11分([4 3 1])。如果用户选择选项“6”,则得12分 我尝试过几
在得分过程中,每个骰子只能选择一次。哪一个骰子组合在一起并不重要,只要它们的总和等于选择值,并且点数的总值最大化。
例如,如果用户选择选项“4”([13]+[4]+[2]+[2]),滚动{1 2 2 3}得到12分。如果用户选择选项“11”,则得11分([4 3 1])。如果用户选择选项“6”,则得12分 我尝试过几种计算方法,但没有一种方法能在100%的情况下给出正确的结果,我现在已经坚持了一天多 我的问题是什么是一个好的解决方案/算法
calc({6,6,6,6,6,5}, 12)=24
calc({6,6,6,6,6,5}, 11)=11
calc({6,6,6,6,6,5}, 3)=0
calc({6,6,6,6,6,5}, 6)=30
非常感谢您的帮助。这是一个组合搜索问题。下面是检查整个搜索空间的递归算法<代码>骰子是一个整数序列(每个整数都是介于1和6之间的数字),
目标
是数字4。。12由玩家选择,best
是先前总计骰子的最佳总和(最初为0):
下面是我的Java实现(我对Java有点生疏):
注意:我使用了
得分
/目标
在您使用计算
/总和
的地方,我使用了向量
在您使用列表
的地方。。我将让您编写适当的适配器,我们可以想象的一种状态是,当我们迭代输入时,每个“选项”(从1到12的总和)有多少。这里是一种递归方法,它尝试将当前骰子添加到不同的和中,以查看哪一个胜出
状态(和返回值)是一个数组,其中第一个元素是可实现的最大和,其余元素是数组中等于其索引的和的计数(只有总计到最大值的元素才相关)
JavaScript代码(考虑到这些限制,似乎不需要备忘录):
功能f(骰子){
函数g(i,状态){
如果(i==骰子长度)
返回状态;
恒量=骰子[i];
//增加模具零件的数量
const_state=state.slice();
_状态[die]+=1;
_状态[0]=数学最大值(_状态[0],_状态[die]*die);
设best=g(i+1,_状态);
//试着把骰子加到其他总数上
for(设j=1;j最佳[0])
最佳=下一个;
}
}
回报最好;
}
返回g(0,新数组(13)。填充(0);
}
var博弈=[
[1, 2, 4, 2, 3, 3],
[4, 2, 4, 2, 2, 6],
[6, 6, 6, 6, 6, 5]
];
为了(让我们掷骰子游戏){
log(JSON.stringify(dice));
log(JSON.stringify(f(dice));
控制台日志(“”);
}
{1 2 4 2 3}如果用户选择选项“4”,则得12分。为什么是12分?你能详细介绍一下分数的计算方法吗?有4种组合给出了4的和:[(1,3),(1,3),(2,2),(4)]。那么分数不是应该是4吗?每个骰子只能选择一次进行评分。我修改了文本。如果你有{4 2 6}和是6怎么办?答案是12(2+2+2,6)还是18(4+2,4+2,6)?{4 2 6}如果选择“6”正确,你会得到[4 2][4 2][6]的18?[2][6]也是一个选项,但得分较小,为12分。因此,18应该是这里的答案(?)wcochran正确。选择哪一个骰子并不重要,只要它们的总和与选择选项值相加并使点数最大化。
score(target, dice, best=0) {
hi = best;
for all subsets S of dice
if sum S = target
val = score(target, dice - S, best + target)
if val > hi
hi = val;
return hi;
}
import java.util.Vector;
public class DiceGame {
public int targetSum;
public DiceGame(int t) {targetSum = t;}
public int sumOfDice(Vector<Integer> dice) {
int s = 0;
for (int d : dice)
s += d;
return s;
}
public int score(Vector<Integer> dice) {
return score(dice, 0);
}
public int score(Vector<Integer> dice, int bestPrev) {
int hi = bestPrev;
for (int n = 1; n < (1 << dice.size()); n++) {
Vector<Integer> subset = new Vector<Integer>();
Vector<Integer> remaining = new Vector<Integer>();
for (int i = 0; i < dice.size(); i++) {
if ((n & (1 << i)) != 0)
subset.add(dice.get(i));
else
remaining.add(dice.get(i));
}
if (sumOfDice(subset) == targetSum) {
int s = score(remaining, bestPrev + targetSum);
if (s > hi)
hi = s;
}
}
return hi;
}
public static void main(String[] args) {
Vector<Integer> dice = new Vector<Integer>();
// 4 2 4 2 2 6
dice.add(4);
dice.add(2);
dice.add(4);
dice.add(2);
dice.add(2);
dice.add(6);
DiceGame diceGame = new DiceGame(6);
int s = diceGame.score(dice);
System.out.println(s);
}
}
$ java DiceGame
18