题目:
某人写了n封信要放到n个信封里面,且第一封信要放到1号信封,第二封信要放到2号信封,以此类推。如果所有的信都装错了信封。求所有的信都装错信封,共有多少种不同情况。
解析:
我们先思考一下
n有n-1种放法
我们再将
n放下来的位置是赋值给k
就会有两种方法
第一种是将k
放回n的初始位置
就等于将n与k交换了一下
那剩下来的
就是n-2个数的信封错排
否则的话
就是将n-1个数进行信封错排
所以
状态转移方程就是
f[n]=(n-1)*(f[n-1]+f[n-2])
下面是代码
代码:
#include<bits/stdc++.h>
#include<iostream>
#include<cstdlib>
#include<cstdio>
using namespace std;
int f[1000],n;
int main()
{
cin>>n;
f[1]=0;
f[2]=1;
for(int i=3;i<=n;i++) f[i]=(i-1)*(f[i-2]+f[i-1]);
cout<<f[n]<<" ";
return 0;
}
拜拜!!
本文探讨了使用动态规划解决信封错排问题,即所有信件都不放入正确信封的情况。通过分析,得出了状态转移方程f[n]=(n-1)*(f[n-1]+f[n-2]),并提供了C++代码实现。


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



