题目描述
n 封信,n个信封,n封信全部装错,问装错的次数又多少次
分析
n=1时,F[1]=0;n=2,F[2]=1; n封信时,不妨设第一封信在第m信封中,2<=m<=n;分类,若第m封信在第一信封中,两者对换下,则装错方式次数F[n-2],若第m封信不在第一信封中,两者对换下,则装错方式次数F[n-1];
F[n] = (n-1)(F(n-1)+F(n-2))
代码
#include<iostream>
using namespace std;
int dp[21];
int main()
{
int n;
while(cin>>n)
{
dp[1]=0;
dp[2]=1;
for(int i=3;i<=n;i++)
{
dp[i]=(i-1)*(dp[i-1]+dp[i-2]);
}
cout<<dp[n]<<endl;
}
}
网友评论