一道笔试题,抛骰子8次,和为多少最大,对于笔试题可以这样考虑,两个骰子和为 7的概率最大,8次的话最大为28.
下面编程给出说明,result[i][j] 代表抛i次时,和为j 的次数。对于第i+1 次可使用前面的结果来计算,如计算 result[i+1][48] 可以 把result[i][48-1], result[i][48-2],result[i][48-3],result[i][48-4],result[i][48-5],result[i][48-6] 的值加起来,这样的话就可以自底向上的推出任意次抛骰子的和的结果。
算法如下:
public static void rollDice(int cnt){
int result[][] = new int[cnt+1][cnt*6+1];
result[1][1]=1;
result[1][2]=1;
result[1][3]=1;
result[1][4]=1;
result[1][5]=1;
result[1][6]=1;
for(int i=2; i <= cnt;i++){
for(int j=i;j<=i*6;j++){
for(int k=1;k<=6;k++){
if(k<j){
result[i][j] +=result[i-1][j-k];
}
}
}
}
for(int i=cnt;i<=cnt*6;i++){
System.out.println("sum "+i+"\tcnt: "+result[cnt][i]);
}
}
public static void main(String[] args) {
rollDice(8);
}
//result
sum 8 cnt: 1
sum 9 cnt: 8
sum 10 cnt: 36
sum 11 cnt: 120
sum 12 cnt: 330
sum 13 cnt: 792
sum 14 cnt: 1708
sum 15 cnt: 3368
sum 16 cnt: 6147
sum 17 cnt: 10480
sum 18 cnt: 16808
sum 19 cnt: 25488
sum 20 cnt: 36688
sum 21 cnt: 50288
sum 22 cnt: 65808
sum 23 cnt: 82384
sum 24 cnt: 98813
sum 25 cnt: 113688
sum 26 cnt: 125588
sum 27 cnt: 133288
sum 28 cnt: 135954
sum 29 cnt: 133288
sum 30 cnt: 125588
sum 31 cnt: 113688
sum 32 cnt: 98813
sum 33 cnt: 82384
sum 34 cnt: 65808
sum 35 cnt: 50288
sum 36 cnt: 36688
sum 37 cnt: 25488
sum 38 cnt: 16808
sum 39 cnt: 10480
sum 40 cnt: 6147
sum 41 cnt: 3368
sum 42 cnt: 1708
sum 43 cnt: 792
sum 44 cnt: 330
sum 45 cnt: 120
sum 46 cnt: 36
sum 47 cnt: 8
sum 48 cnt: 1