动态规划 信封错排

本文探讨了使用动态规划解决信封错排问题,即所有信件都不放入正确信封的情况。通过分析,得出了状态转移方程f[n]=(n-1)*(f[n-1]+f[n-2]),并提供了C++代码实现。

动态规划 信封错排

题目:

某人写了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;
}

拜拜!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值