Java 如何计算其组合值等于输入数的骰子总数

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分 我尝试过几

我应该为掷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分

我尝试过几种计算方法,但没有一种方法能在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