【题解】收集邮票
#include<bits/stdc++.h>
using namespace std;
//设g[i]表示购买了i张邮票,买完剩下邮票需要的期望钱数.
//设f[i]表示拿到了i张邮票,要取完剩下邮票需要的期望次数.
//∴有n-i/n的几率拿到没有拿过的邮票,有i/n的几率拿到拿过的邮票.
//那么有:f[i]=((n-i)/n)*f[i+1]+(i/n)*f[i]+1.
// ((n-i)/n)*f[i]=((n-i)/n)*f[i+1]+1.
// f[i]=f[i+1]+((n-i)/n).
//又有:g[i]=(i/n)*(g[i]+f[i])+((n-i)/n)*(g[i+1]+f[i+1])+1.
// 即:g[i]=(i/(n-i))*(f[i]+1)+g[i+1]+f[i+1]+1.
long long n;
double f[10001],g[10001];
int main(){scanf("%lld",&n);for(long long i=n-1;i>=0;i--){f[i]=f[i+1]+(double)(1.0*n/(n-i));g[i]=(double)(1.0*i/(n-i))*(f[i]+1)+g[i+1]+f[i+1]+1;}printf("%.2lf",g[0]);
}
【题解】收集邮票
#include<bits/stdc++.h>
using namespace std;
//设g[i]表示购买了i张邮票,买完剩下邮票需要的期望钱数.
//设f[i]表示拿到了i张邮票,要取完剩下邮票需要的期望次数.
//∴有n-i/n的几率拿到没有拿过的邮票,有i/n的几率拿到拿过的邮票.
//那么有:f[i]=((n-i)/n)*f[i+1]+(i/n)*f[i]+1.
// ((n-i)/n)*f[i]=((n-i)/n)*f[i+1]+1.
// f[i]=f[i+1]+((n-i)/n).
//又有:g[i]=(i/n)*(g[i]+f[i])+((n-i)/n)*(g[i+1]+f[i+1])+1.
// 即:g[i]=(i/(n-i))*(f[i]+1)+g[i+1]+f[i+1]+1.
long long n;
double f[10001],g[10001];
int main(){scanf("%lld",&n);for(long long i=n-1;i>=0;i--){f[i]=f[i+1]+(double)(1.0*n/(n-i));g[i]=(double)(1.0*i/(n-i))*(f[i]+1)+g[i+1]+f[i+1]+1;}printf("%.2lf",g[0]);
}