配对问题

题目描述:

某人写了n封信和n个信封,如果所有的信都装错了信封。求所有的信都装错信封共有多少种不同情况。

基本形式:D[1]=0;d[2]=1

递归式:d[n]= (n-1)*( d[n-1] + d[n-2])

输入样例:

7

输出样例:

1854

代码如下:

#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
int xf(int x)
{
if(x==1)return 0;
if(x==2)return 1;
return (x-1)*(xf(x-1)+xf(x-2));
}
int main()
{
int n;
scanf("%d",&n);
cout<<xf(n);
return 0;
}

此类问题为配对问题,还可以这样问n个战士有自己固定的枪,问没有一个人拿对自己枪的情况;

接下来进行一下扩展:

错排公式:

问题: 十本不同的书放在书架上。现重新摆放,使每本书都不在原来放的位置。有几种摆法?

这个问题推广一下,就是错排问题,是组合数学中的问题之一。考虑一个有n个元素的排列,若一个排列中所有的元素都不在自己原来的位置上,那么这样的排列就称为原排列的一个错排。 n个元素的错排数记为D(n)。 研究一个排列错排个数的问题,叫做错排问题或称为更列问题。

递推的推导错排公式

D(n) = (n-1) [D(n-2) + D(n-1)]

特殊地,D(1) = 0, D(2) = 1;关于推导 自己百度吧....

时间: 2024-10-12 13:27:50

配对问题的相关文章

ACM:UESTC - 649 括号配对问题 - stack

  UESTC - 649  括号配对问题 Time Limit: 1000MS   Memory Limit: 65535KB   64bit IO Format: %lld & %llu Description 大家都知道算术表达式中,括号必须配对,现在任意给出一个算术表达式,判断其括号是否配对.如果配对,输出Yes,否则输出No. Input 含多组测试数据,输入首先是一个整数T表示测试数据组数(0<T≤300).随后有T行测试数据,长度不超过1000个字符,字符串间不含空格. Out

ACM:括号配对问题

括号配对问题:http://acm.nyist.net/JudgeOnline/problem.php?pid=2 思路:利用栈先进后出的性质,左符入,右符出. #include<iostream> #include<string> #include<stack> using namespace std; bool check(string str) { stack<char> stack; for (int i = 0; i < str.length

NYOJ-括号配对问题 &lt;技巧性的非栈道法&gt;

括号配对问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 现在,有一行括号序列,请你检查这行括号是否配对. 输入 第一行输入一个数N(0<N<=100),表示有N组测试数据.后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组.数据保证S中只含有"[","]","(",")"四种字符. 输出 每组输入数据的输出占一行

NYOJ 2 括号配对问题

/* 题目大意:求括号是否配对 解题思路:开一个数组b,来作为栈,top为栈的下个下标控制入栈和出栈 难点详解:见代码 关键点:对进栈和出栈了解深刻一点 解题人:lingnichong 解题时间:2014/08/15  19:46:45 解题体会:最基本栈的运用.一开始还不是很清楚.可以先背一下,每天睡觉前再看一下,到用的时候,再根据这个模板写出来就可以了,这样印象会更加深刻了 */ #include<stdio.h> #include<string.h> #define MAXN

点集配对问题

点集配对问题  空间里n个点,使它们配成n/2对点,使得每个点恰好在一个点对中. 要求所有点队中,两点距离之和尽量下  n <= 20 d(s) = min(d{S - {i} - {j}+ |Pi Pj|  | j属于S, j > i, i = min{S}} //#pragma comment(linker, "/STACK:102400000,102400000") //HEAD #include <cstdio> #include <cstring

NYOJ 2 括号配对问题【栈的运用】

括号配对问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 现在,有一行括号序列,请你检查这行括号是否配对. 输入 第一行输入一个数N(0<N<=100),表示有N组测试数据.后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组.数据保证S中只含有"[","]","(",")"四种字符 输出 每组输入数据的输出占一行,

nyist 2 括号配对问题

括号配对问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 现在,有一行括号序列,请你检查这行括号是否配对. 输入 第一行输入一个数N(0<N<=100),表示有N组测试数据.后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组.数据保证S中只含有"[","]","(",")"四种字符 输出 每组输入数据的输出占一行,

NYOJ2 括号配对问题

括号配对问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 现在,有一行括号序列,请你检查这行括号是否配对. 输入 第一行输入一个数N(0<N<=100),表示有N组测试数据.后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组.数据保证S中只含有"[","]","(",")"四种字符 输出 每组输入数据的输出占一行,

ACM--括号配对问题

第一行输入一个数N,表示有N组测试数据.后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组.数据保证S中只含有"[","]","(",")"四种字符.每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No. 样例输入 3 [(]) (]) ([[]()]) 样例输出 No No Yes C++: #include<