网易历届笔试题(7)

题目描述

小易参加了一个骰子游戏,这个游戏需要同时投掷n个骰子,每个骰子都是一个印有数字1~6的均匀正方体。
小易同时投掷出这n个骰子,如果这n个骰子向上面的数字之和大于等于x,小易就会获得游戏奖励。
小易想让你帮他算算他获得奖励的概率有多大。

输入描述:

输入包括两个正整数n和x(1 ≤ n < 25, 1 ≤ x < 150),分别表示骰子的个数和可以获得奖励的最小数字和。

输出描述:

输出小易可以获得奖励的概率。
如果概率为1,输出1,如果概率为0,输出0,其他以最简分数(x/y)的形式输出。

示例1

输入

3 9

输出

20/27

思路:将问题转化为01背包问题即可,只有1到6六种数字,并且每种数字可以看作最多只用用n次,之后就是01背包的经典递推了

import java.util.*;
public class Main{
    public static void main(String[] args){
        int n,x;
        Scanner in=new Scanner(System.in);
        n=in.nextInt();
        x=in.nextInt();
        long[][] dp=new long[155][30];
        for(int i=1;i<=6;i++)
            dp[i][0]=1;
        for(int i=1;i<n;i++)
            for(int j=1;j<=6;j++)
                for(int k=150;k>=j;k--)
                    dp[k][i]+=dp[k-j][i-1];
        long a=0,b=0;
        for(int i=1;i<=150;i++){
            b+=dp[i][n-1];
            if(i>=x) a+=dp[i][n-1];
        }
        if(a==0) System.out.println(0);
        else if(a==b) System.out.println(1);
        else System.out.println(a/gcd(a,b)+"/"+b/gcd(a,b));
    }
    private static long gcd(long a,long b){
        if(b==0)
            return a;
        return gcd(b,a%b);
    }
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值