首页 > 代码库 > 【编程题目】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。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。