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。
原文:http://www.cnblogs.com/dplearning/p/3917014.html