杭电2048(此种方法比较麻烦的,建议推荐本人的 【杭电2048(递推)】http://www.cnblogs.com/xiohao/archive/2012/09/28/2706573.html)
问题分析:此题也是一道递推问题!首先,当m=4的时候 例如 {1 2 3 4 其中当1取2的时候
1 2 3 4}
此时如果2取1,则只能3和4互相交换({3 4 相当于a[2]的值)!如果2取3或4,则剩余{3 4
3 4} 1 4}
此时相当于{1 2 3 中1取2剩余的情况!!依次类推 b=(double)1/(i-1)*a[i-2]+(double)(i-2)/(i-1)*Q;
1 2 3} a[i]=(double)(i-1)/i*b;
#include<iostream>
using namespace std;
int main()
{
int n,m,i;double a[25],b,Q;
cin>>n;
getchar();
while(n--)
{
cin>>m;
a[1]=0;
a[2]=0.5;
a[3]=(double)1/3;
Q=0.5;
for(i=4;i<=m;i++)
{ b=(double)1/(i-1)*a[i-2]+(double)(i-2)/(i-1)*Q;
a[i]=(double)(i-1)/i*b;
Q=b;
}
printf("%.2lf",a[m]*100);cout<<"%"<<endl;
}
return 0;
}