题意....挺简单的就自己读吧。
做法..更简单了.dp方程f[i][j]=f[i-1][j]*j+f[i-1][j-1];f[i][j]表示长度为i其中最大数为j
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<cstdlib>
using namespace std;
double f[210][210];
int n;
int main()
{
double sum;
while (scanf("%d",&n)&&n!=0)
{
memset(f,0,sizeof(f));
f[0][0]=1;
sum=0;
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
f[i][j]+=f[i-1][j-1]+f[i-1][j]*(j);
for (int i=1;i<=n;i++)
sum+=f[n][i];
printf("%d %.0f\n",n,sum);
}
return 0;
}

本文介绍了一种使用动态规划(DP)解决组合数学问题的方法,通过定义状态转移方程f[i][j]=f[i-1][j]*j+f[i-1][j-1],其中f[i][j]表示长度为i且最大数为j的组合情况数量。通过循环求解,最终计算出长度为n的所有可能的最大数组合总数,并进行输出。
1731

被折叠的 条评论
为什么被折叠?



