首页 > 代码库 > 【编程题目】n 个骰子的点数

【编程题目】n 个骰子的点数

67.俩个闲玩娱乐(运算)。
2.n 个骰子的点数。
把 n 个骰子扔在地上,所有骰子朝上一面的点数之和为 S。输入 n,
打印出 S 的所有可能的值出现的概率。

 

思路:用递归把每个骰子的可能情况变量,记录各种和S出现的次数 比上 总情况数就是概率

/*67.俩个闲玩娱乐(运算)。2.n 个骰子的点数。把 n 个骰子扔在地上,所有骰子朝上一面的点数之和为 S。输入 n,打印出 S 的所有可能的值出现的概率。*/#include <stdio.h>#include <stdlib.h>#include <string.h>#include<math.h>void getallarr(int n, int * record) //递归得到每个可能出现的和出现的次数{    static int sum = 0;    static int num = n;    if (0 == n)    {        record[sum - num]++;        return;    }    for (int i = 1; i <= 6; i++)    {        sum += i;        getallarr(n - 1, record);        sum -= i;    }}void printall(int n){    if (0 == n)    {        printf("input error");    }    int * record =(int *)malloc((5 * n + 1) * sizeof(int));    memset(record, 0, (5 * n + 1) * sizeof(int));    getallarr(n, record);    for (int i = n; i <= 6*n; i++)    {        printf("%d:%d/%d\n", i, record[i - n],int(pow(6.0,n)));    }
   free(record);}
int main(){ printall(8); return 0;}

 

看网上的答案,发现可以用动态规划。

http://blog.csdn.net/whuqin/article/details/6639187

1.现在变量有:骰子个数,点数和。当有k个骰子,点数和为n时,出现次数记为f(k,n)。那与k-1个骰子阶段之间的关系是怎样的?

2.当我有k-1个骰子时,再增加一个骰子,这个骰子的点数只可能为1、2、3、4、5或6。那k个骰子得到点数和为n的情况有:

(k-1,n-1):第k个骰子投了点数1

(k-1,n-2):第k个骰子投了点数2

(k-1,n-3):第k个骰子投了点数3

....

(k-1,n-6):第k个骰子投了点数6

在k-1个骰子的基础上,再增加一个骰子出现点数和为n的结果只有这6种情况!

所以:f(k,n)=f(k-1,n-1)+f(k-1,n-2)+f(k-1,n-3)+f(k-1,n-4)+f(k-1,n-5)+f(k-1,n-6)

3.有1个骰子,f(1,1)=f(1,2)=f(1,3)=f(1,4)=f(1,5)=f(1,6)=1。