码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2014-08-16 23:38:31      阅读:235      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   io   strong   for   ar   

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。

【编程题目】n 个骰子的点数,布布扣,bubuko.com

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

标签:style   blog   http   color   io   strong   for   ar   

原文地址:http://www.cnblogs.com/dplearning/p/3917014.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!