题解 P2059 【[JLOI2013]卡牌游戏】
概率dp
不懂的同学可以先看这里
然后关于本题。。。这张图说明了一切

摘自钟梓俊dalao题解
上代码
#include<bits/stdc++.h>
using namespace std;
int n,m;
int num[60];
double dp[60][60];//表示剩i个时从庄家数第j个的获胜概率
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++)
{
cin>>num[i];
}
dp[1][1]=1;
for(int i=2;i<=n;i++)
{
for(int j=1;j<=i;j++)
{
for(int k=1;k<=m;k++)
{
int c=(num[k]%i)?(num[k]%i):i;
if(c>j)
{
dp[i][j]+=dp[i-1][i-c+j]/m;
}
else
if(c<j)
{
dp[i][j]+=dp[i-1][j-c]/m;
}
}
}
}
for(int i=1;i<=n;i++)
{
printf("%.2lf",dp[n][i]*100);
cout<<"% ";//玄学输出?
}
}

浙公网安备 33010602011771号