初入算法篇(递推)错排公式

将n封信放入n个信封,每一封信对应一个特定的信封,那么如果n封信全部放错的组合有多少种

当n个元素放入n个特定位置,我们用s[n]来表示n封信放入n个位置,s[n-1]表示n-1封信放入n-1个位置,我们假设将第n封信放入第k个位置,那么总共有n-1个选择,接着对于n位置我们有两种情况

1.如果将第k封信放入第n个位置,即n和k互相放反了,那么对于全局来说,我们只剩下n-2封信了,即s[n-2]

2.如果第k封信不放入第n个位置,即我们还有n-1个元素没有放,我们有s[n-1]种方法

故总共方程可列出s[n]=(n-1)*(s[n-1]+s[n-2])边界s[1]=0;s[2]=1;

这题目纯粹是掌握公式,学会更多的东西

#include <iostream>
#include <algorithm>
#include <cstdio>

using namespace std;
long long s[1009];
int main()
{
    s[0]=0;
    s[1]=0;//没有错排可能
    s[2]=1;
    int i,n;
    for(i=3;i<=1000;i++)
    {
        s[i]=(i-1)*(s[i-1]+s[i-2]);
    }
    scanf("%d",&n);
    printf("%lld",s[n]);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值