随笔- 177  文章- 0  评论- 0  阅读- 1458 

                                                                                             

                                   📑打牌 : da pai ge的个人主页
                                   🌤️个人专栏 : da pai ge的博客专栏
                                   ☁️宝剑锋从磨砺出,梅花香自苦寒来

目录

☁️题目解析

☁️解题思路

☁️示例代码


☁️题目解析

错排问题举例:
A B C…… 表示写着n位友人名字的信封, a b c…… 表示n份相应的写好的信纸。把错装的总数为记作
D(n) 。假设把 a错装进B里了 ,包含着这个错误的一切错装法分两类:
b 装入A里,这时每种错装的其余部分都与 A B a b 无关,应有 D(n 2) 种错装法。
b装入 A B 之外的一个信封,这时的装信工作实际是把(除 a 之外的) n 1 份信纸b、c …… 装入(除 B 以外
的) n 1 个信封 A C…… ,显然这时装错的方法有 D(n 1) 种。
总之在a装入 B 的错误之下,共有错装法 D(n 2) D(n 1) 种。
a 装入 C ,装入 D…… n 2 种错误之下,同样都有 D(n 1) D(n 2) 种错装法,因此 D(n) (n 1)[D(n 1) D(n
2)]
D(n) = (n-1) [D(n-2) + D(n-1)]
特殊地, D(1) = 0, D(2) = 1.

☁️解题思路

错排的递推公式是: D(n) = (n - 1) [D(n - 2) + D(n - 1)] ,也就是第 n 项为 n - 1 倍的前两项和。通过这个递推公式可以
得到在总数为 n 的时候,错排的可能性一共有多少种。那么要求错排的概率,我们还需要另一个数值,就是当总数
n 的时候,所有的排列组合一共有多少种,那么根据排列组合,肯定是使用
的公式来求,也就是 n 的阶乘。所以结果很简单,就是用公式求出第 n 项的错排种类,和 n 的阶乘,然后两者一除,
就是概率了。

☁️示例代码

import java.util.*;
public class Main{
public static void main(String[] args){
long d[] = new long[21]; // 错排数据
d[0] = d[1] = 0;
d[2] = 1;
long f[] = new long[21]; // 阶乘
f[0] = f[1] = 1;
f[2] = 2;
// 算N错排数据和阶乘
for(int i = 3; i <= 20; ++i){
d[i] = (i-1) * (d[i-1] + d[i-2]);
f[i] = i * f[i-1];
}
Scanner sc = new Scanner(System.in);
while(sc.hasNext()){
int n = sc.nextInt();
System.out.printf("%.2f%%\n", 100.0*d[n]/f[n]);
}

 posted on   dapaige  阅读(4)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示