【题目与出处】
题目:Coupons
出处:UVa 10288
【题意概述】
描述:一共有n种不同的Coupons,每次得到每种Coupons的概率相同。问期望多少次可以得到所有的n种Coupons,以带分数形式输出。
数据范围:1<=n<=33
【算法分析】
该题目涉及到求数学期望,可以采用分治法的思想,每一次在上一次的期望下得到最新的期望。当已经有k种Coupons得到时,得到新的Coupons的概率为(n-k)/n,期望值为n/(n-k),所以可以得出总步数的期望值为:。
【代码实现】
代码实现为java实现
package main;
public class Coupons {
public static class Fraction{
//分子
public long numerator;
//分母
public long denominator;
public Fraction(long numerator, long denominator){
this.numerator = numerator;
this.denominator = denominator;
}
public void add(Fraction frac){
long num1 = this.numerator * frac.denominator;
long num2 = this.denominator * frac.numerator;
long theNumerator = num1+num2;
long theDenominator = this.denominator * frac.denominator;
this.numerator = theNumerator;
this.denominator = theDenominator;
release();
}
public void show(){
System.out.println(this.numerator + "/" + this.denominator);
}
//辗转相除法求进行约分
private void release(){
long tempBig = this.numerator > this.denominator ? this.numerator:this.denominator;
long tempSmall = this.numerator < this.denominator ? this.numerator:this.denominator;
long temp;
while(tempBig % tempSmall != 0){
temp = tempBig % tempSmall;
tempBig = tempSmall;
tempSmall = temp;
}
temp = tempSmall;
this.numerator = this.numerator / temp;
this.denominator = this.denominator / temp;
}
}
public static Fraction coupons(long n){
Fraction answer = new Fraction(0,1);
for(long i=0; i<n; i++){
answer.add(new Fraction(n, n-i));
}
answer.show();
return answer;
}
public static void main(String args[]){
coupons(33);
}
}