double* twoSum(int n, int* returnSize){ int dp[15][70] = {0}; //赋予初始值,只有一个骰子的时候1到6出现的频率均为1 for (int i = 1; i <= 6; i ++) { dp[1][i] = 1; } //从两个骰子的情况开始轮询 for (int i = 2; i <= n; i ++) { //出现的次数为(6i+1)-i,因为最小值为所有骰子均为1的情况,不存在某个骰子为0的情况,所以均为1的情况只有一种 for (int j = i; j <= 6*i; j ++) { //轮询最后一个骰子可能出现的情况数 for (int cur = 1; cur <= 6; cur ++) { //当前出现的情况一定要大于骰子的数字才能进行动态规划 if (j - cur <= 0) { break; } //当前位置的值等于少一个骰子的情况下出现的情况减去当前骰子数字的值的累加和,即当前的值为少一个骰子的情况下再多加入一个骰子时能产生的所有情况出现频率的总和 dp[i][j] += dp[i-1][j-cur];//第n个骰子的点数为cur,它与前n-1个筛子的点数和为某个确定的数时,共有多少种骰子点数的组合 } } } int all = pow(6, n); double *res = (double *)malloc(sizeof(double) * (5 * n + 1)); for (int i = n; i <= 6 * n; i ++) {//最小点数为n个骰子全为1,最大全为6 //结果下标为i-n是因为骰子的情况每多一个,出现的情况值就向后移动一位,因为不存在某一个骰子为0的情况,所以均为1的情况就是i=n的位置,在这里起始,但是结果数组需要从0开始,所以要将开头前移到0处 res[i - n] = dp[n][i] * 1.0 / all; } *returnSize = 5 * n + 1; return res; }