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

糊涂人寄信——递推

思路分析:当有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;
}


http://www.kler.cn/a/594929.html

相关文章:

  • Unity动画片段丢失(AnimationClip),如何进行重新绑定
  • DApp+公链/主链+钱包+Swap开发西安区块链公司
  • 华为中小型企业项目案例
  • 理解Akamai EdgeGrid认证在REST API中的应用
  • 手机换IP有什么用?最新换IP方法
  • MySql 存储引擎 InnoDB 与 MyISAM 有什么区别
  • 车载以太网网络测试-18【传输层-DOIP协议-1】
  • 根据模板将 Exce 明细数据批量生成 PPT 文档|邮件合并
  • 搭建React简单项目
  • PCDN 在去中心化互联网中的角色
  • 前端知识-CSS(二)
  • python自动化脚本编写-处理文件、数据分析
  • Vue.js 中的 Memoization:提升性能的缓存技术
  • MySQL 创建用户,建库,建表
  • 【Qt】信号signal是单向的
  • 【数学建模】灰色关联分析模型详解与应用
  • Nginx之Basic Auth认证
  • 算法刷题整理合集(五)
  • 飞算JavaAI:AI辅助编程工具在复杂业务场景中的应用实践
  • Kafka分区分配策略详解