当前位置: 首页 > news >正文

糊涂人寄信——递推

思路分析:当有n封信,n个信封时。第k封信没有装在第k个信封里(k从1~n),就算所有的信封都装错了。我们可以得知的是,当有1封信,时,装错类别数为0。当有两封信时,装错类别为1。

当有三封信时,我们可以先拆解问题,假设第一封信装错了位置(有两种可能),那么就还剩下2封信要装错位置,而两封信要装错的类别我们也已经求解得知了,所以这里3封信要装错位置的类别数就为 第一封信装错位置的可选择数+剩下的信的装错总类别。也就是2*1=1。

要装错一共分为两个大类。(0<x<n,0<y<n)

1:当第x封信装进了第y个信封时(y有n-1个选择),第y封信也恰好装进了第x个信封。此时还有n-2封信需要装错。(n-1)*x[n-2]

2:当第x封信装进了第y个信封时(y有n-1个选择),第y封信没有恰好装进了第x个信封。此时还有n-1封信需要装错。(n-1)*x[n-1]

总加起来就是 sum=(n-1)*x[n-2]+(n-1)*x[n-1];

代码实现:

#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include <algorithm>
#include <iomanip>
#include <string> 
#include <stack> 
#define MAX 100
using namespace std;
long long int n, arr[MAX];/*数组用来存数字*/

long long int f(int x)
{
   if(x==1) return 0 ;
   if (x == 2) return 1;
   else return (x - 1) * f(x - 1) + (x - 1) * f(x - 2);
}
int main()
{
    cin >> n;
    f(n);
    cout << f(n) << endl;
    return 0;
}

相关文章:

  • 算法设计与分析——动态规划
  • KnowGPT知识图谱整合
  • 深入浅出理解LLM PPO:基于verl框架的实现解析之一
  • Java并发编程面试题:锁(17题)
  • c++ 数组索引越界检查
  • 解决 C 盘空间不足,免费软件高效清理
  • Python 用户账户(创建用户账户)
  • GaussDB构建高性能Schema:分布式数据库架构设计与实战
  • python NameError报错之导库报错
  • C++代码2-多目标算法求解车辆路径规划
  • 阻止 Mac 在运行任务时进入休眠状态
  • Linux python 安装 conda(内部自带的有python的版本了)
  • 通俗详解redis底层数据结构哈希表之渐进式rehash
  • Windows10配置OpenJDK11
  • VSCode下载安装指南
  • 零、ubuntu20.04 安装 anaconda
  • 建模中的特征衍生技巧总结(含各类常用衍生函数)
  • kali,NTFS,用户管理,文件共享,本地安全策略,计算机基础
  • OpenCV 其他模块使用指南
  • C++20 中 `constexpr` 的强大扩展:算法、工具与复数库的变革
  • 一周文化讲座|“我的生命不过是温柔的疯狂”
  • “家国万里时光故事会” 举行,多家庭共话家风与家国情怀
  • 普京确定俄乌谈判俄方代表团名单
  • 商务部新闻发言人就出口管制管控名单答记者问
  • 陕西旱情实探:大型灌区农业供水有保障,大旱之年无旱象
  • 上海国际电影节纪录片单元,还世界真实色彩