使用 动态规划问题 :
当 dice=1:
当 dice=2:
进行对比 第m颗 dice时候 和位S :等于前m-1颗dice 结果S-1出现结果有关系的 f(n)=f(n-1)+f(n-2)+f(n-3)+f(n-4)+f(n-5)+f(n-6) 当前 m-1颗dice 与现状 和S相差 最多6时候,结果等于此连加
1 package LeetCode; 2 3 public class offer43 { 4 5 public static void main(String[] args) { 6 // TODO Auto-generated method stub 7 8 PrintProbability(2); 9 } 10 public static void PrintProbability(int num) 11 { 12 if(num<=0) 13 return; 14 15 int g_maxvalue=6; 16 int[][]probability=new int[2][]; 17 18 probability[0]=new int[g_maxvalue*num+1]; 19 probability[1]=new int[g_maxvalue*num+1]; 20 21 int dice=0; 22 23 /*第一颗 dice 1-6 出现次数全是1*/ 24 for(int i=1;i<=g_maxvalue;i++) 25 probability[0][i]=1; 26 27 for(int k=2;k<=num;k++) 28 { 29 for(int i=0;i<k;i++) 30 // 使用两个数组,轮回记录当前dice 和前 dice 出现次数,不断重复轮回 31 probability[1-dice][i]=0; 32 33 //开始进行计数baocun 34 for(int i=k;i<=g_maxvalue*k;i++) 35 { 36 probability[1-dice][i]=0; 37 38 for(int j=1;j<=g_maxvalue && j<=i;j++) 39 { 40 probability[1-dice][i]+=probability[dice][i-j]; 41 } 42 } 43 44 // 让 dice 在 0-1之间变化 45 dice=1-dice; 46 47 } 48 49 double total=Math.pow(g_maxvalue,num); 50 for(int i=num;i<=g_maxvalue*num;i++) 51 { 52 double ratio= (double)probability[dice][i]/total; 53 System.out.print(i + " " + probability[dice][i] +" "+ratio ); 54 System.out.println(); 55 } 56 } 57 }
1 2 1 0.027777777777777776 2 3 2 0.05555555555555555 3 4 3 0.08333333333333333 4 5 4 0.1111111111111111 5 6 5 0.1388888888888889 6 7 6 0.16666666666666666 7 8 5 0.1388888888888889 8 9 4 0.1111111111111111 9 10 3 0.08333333333333333 10 11 2 0.05555555555555555 11 12 1 0.027777777777777776