这是一个比赛题
营销策略
(pattern.cpp/c/pas)
【题目描述】
W 记的儿童套餐会赠送一份小玩具,赠送的小玩具共有n 种。
小朋友买了m 份儿童套餐,求收集齐n 种小玩具的概率。假设每份儿童套餐赠送的
小玩具的种类是等概率随机的。
【输入格式】
从pattern.in 中输入数据
一行,两个整数n,m。
【输出格式】
输出到pattern.out 中
一个实数表示收集齐小玩具的概率,保留4 位小数。
【样例输入】
2 3
【样例输出】
0.7500
【数据规模与约定】
对于10% 的数据保证:n = 1
对于30% 的数据保证:n 2
对于60% 的数据保证:n,m 20
对于100% 的数据保证:1 n,m 1000
【思路】
第一次做数学期望和概率类的dp。。感觉压力很大。。
f[i][j]表示前i个玩具中抽中j个不同的概率
for (int j=0;j<=n;j++) { f[i+1][j]+=f[i][j]*j/n; f[i+1][j+1]+=f[i][j]*(n-j)/n; }
【代码】
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> using namespace std; float f[1005][1005]; int main() { freopen("pattern.in","r",stdin); freopen("pattern.out","w",stdout); int n,m; cin>>n>>m; f[0][0]=1; for (int i=0;i<=m-1;i++) { for (int j=0;j<=n;j++) { f[i+1][j]+=f[i][j]*j/n; f[i+1][j+1]+=f[i][j]*(n-j)/n; } } printf("%.4lf ",f[m][n]); return 0; }
【结果】
有经验就好,可以多写一写这样的题目试试看