排列组合问题

来源:互联网 发布:flac ape 播放软件 编辑:程序博客网 时间:2024/06/05 16:22

一、

(1)6*9的方格,左上角起点,右下角终点,请问一共多少种走法?

共走13步,5步向右8步向下。C513=C813=1287种

public class Robot {    public int countWays(int x, int y) {        //总共有x+y-2步,其中向右x-1次,向下y-1次        // write code here        --x;        --y;        int count=1;                for(int i=x+y;i>y;i--){            count=count*i;//往下走        }        for(int i=2;i<=x;i++){            count=count/i;        }        return count;    }}


(2)abcdefg排队,a排b左边不要求连续有多少种?A在b左边且相邻有多少种?

共7!种排法,其中一半a在b左边,一半a在b右边,所以第一问 7!/2

第二问:6!


(3)Abcdef排队,要求a与b、a与c不相邻的种数:

共6!种,ab相邻排法2*5!,ac相邻排法2*5!种,交集bac和cab即2*4!种。

所以问题共有:6!-(2*5!+2*5!)+2*4!种


(4)10个相同的球,放3个不同的桶,每桶至少一个,几种分法?

9个空插入2个挡板,C29


(5)10个不同的球,放3个不同的桶,几种情况?

每个球3中选择,所以103  


(6)10个相同的糖,每天至少吃1个,有几种情况?

10个糖9个空

1天吃完--1种 C09

2天吃完--C19

3天吃完--C29

。。。

10天吃完--C99

以上所有相加


二、

(1)

给定一个等概率随机产生1~5的随机函数,除此之外,不能使用任何额外的随机机制,请实现等概率随机产生1~7的随机函数。(给定一个可调用的Random5::random()方法,可以等概率地随机产生1~5的随机函数)

这道题本质就是得到一串均匀分布且长度大于7的连续序列即可(甚至都不需要连续,只要保证能产生7个以上等概率的数即可),在这个序列里选中7个(或7的倍数个),若得到的数不是这7个中的,重新产生。这样这7个数的概率肯定是相同的。举例int num = 5 * rand5() + rand5();      //生成6~25的数,选取其中7~20这14个数,非这14个数重新生成,最后取余即可


public class Random7 {    private static Random rand = new Random(123456);    // 随机产生[1,5]    private int rand5() {        return 1 + rand.nextInt(5);    }        // 通过rand5实现rand7    public int randomNumber() {        int num=rand5()*5+rand5();        while(num>20||num<7){            num=5*rand5()+rand5();        }        return num%7+1;    }}

-------------------------------------------------------------------------------------------------------------



原创粉丝点击