在高中的时候,我们接触到的排列组合问题是将相同元素放到不同空间,这个很好求。
那么相同元素分配到相同空间怎么办呢?
我在网上大概查了一下,但是也没有解释的很详细的,所以就根据已有的进行了推导,并对已有的部分资料中的错误也在此进行了更正。
接下来我将以放鸡蛋问题作为例子
设有n个鸡蛋,m个篮子,问:

  • 将n个鸡蛋放到m个篮子里,允许有空篮子,有几种方法?
  • 将n个鸡蛋放到m个篮子里,且不允许有空篮子,有几种方法?
    ps:n = 7,m = 3时,1,1,5;1,5,1;5,1,1被认为是同一种分法

F(m,n):将n个鸡蛋给m个篮子,且篮子可以为空
T(m,n):将n个鸡蛋给m个篮子,且篮子不可以为空

对问题2:将n个鸡蛋放到m个篮子里,且不允许有空篮子,有几种方法?

  • m = n:篮子数 = 鸡蛋数时
    很明显,此时只能一个篮子里放一个鸡蛋。所以只有一种方法。
  • m > n:篮子数 > 鸡蛋数时
    不可能。
  • m < n:篮子数 < 鸡蛋数时
    可以先给m个篮子里装入一个鸡蛋,此时就满足了题意,没有篮子是空的。
    剩余的鸡蛋为n-m个再分到m个篮子中,此时允许有篮子分不到鸡蛋。即T(m,n) = F(m,n-m)
    此时就转化为将n-m个鸡蛋装入m个篮子里,且允许有空篮子的问题了。

对于问题1:将n个鸡蛋放到m个篮子里,允许有空篮子,有几种方法?

方法数 = 所有篮子都不空 + 空1个篮子 + 空2个篮子 + … +空m -1个篮子
F(m,n) = T(m,n) + T(m-1,n) + T(m-2,n) + ... + T(1,n),根据上面对问题2的分析我们可知:T(m,n) = F(m,n-m),则上式变为:
F(m,n) = F(m,n-m) + F(m-1,n)这也就是我们后边要用到的递归原型。
对于递归来说,我们要考虑好它的终止条件

  • 当 m = 1即篮子数 = 1时,无论有多少的鸡蛋都只能放进这个篮子里,所以返回1;
  • 当 n = 0即鸡蛋数 = 0时,无论有多少篮子,也没有鸡蛋可以放,所以返回0;
  • 当 n < m 即鸡蛋数 <篮子数时,肯定会有n - m个空篮子,所以我们令m = n;

但此时我们得到的递归式还并不是我们最终需要的,在此我以F(2,2)作为例子:
F(2,2)指将两个鸡蛋放入两个篮子中,且允许有空篮子。那我们仔细想一想其实就能想出来,只有两种分配方法:1,1和2,0。
但此时若我们用上述得到的式子进行计算可得:F(2,2) = F(2,0) + F(1,2) = 1与真实答案不符,仔细观察该式,可知原因:当 m = n时,直接利用变化来的式子未考虑一个篮子放一个鸡蛋的情况,所以还要在上面得到的式子的基础上,对终止条件进行补充:

  • 当 n = m时,令分配方法数 += 1

以数的划分为例题

我用c++以上述思路来解决数的划分:
题目描述
将整数 n 分成 k 份,且每份不能为空,问有多少种不同的分法。当 n=7, k=3 时,下面三种分法被认为是相同的:1,1,5; 1,5,1; 5,1,1

输入格式
一行两个数 n, k。

输出格式
一行一个整数,即不同的分法数。
输入数据

7 3

输出数据

4

四种分法为:1,1,5;1,2,4;1,3,3;2,2,3。

思路:在这里我把数看作鸡蛋,分法看作篮子。

/**
*Filename:heli
*Author:wan
*Date:2022.1.14
*version:1.3
*Description:heli
*/
#include <bits/stdc++.h>
using namespace std;
int number;//分配方法数
int give_space(int m,int n){//篮子是m,鸡蛋是nint sum = 0;if(m ==n){sum += 1;// printf("sum:%d\n",sum);}if(n == 0){//蛋 = 0return 0;}if(m == 1||m == 0){//篮子 = 0/1return 1;}if(n < m){//鸡蛋数<篮子数时,篮子 = 鸡蛋m = n;//此处判断很重要,否则计算时会少1return give_space(m,n);}//printf("%d %d\n",m,n);sum += give_space(m,n-m);sum += give_space(m-1,n);return sum;
}
int main(){int n,k;scanf("%d %d",&n,&k);if(n <= k){number = 1;}else{//k = m,篮子,n是鸡蛋number += give_space(k,n - k);}printf("%d",number);return 0;
}

ps:在终止条件中,当 n < m 即鸡蛋数 <篮子数时,我们令m = n后记得把这个m,n重新传进去,否则会少考虑将每个篮子里放一个鸡蛋的情况。

最后的最后:本文基于个人理解,可能存在错误的地方,如有错误请各位大佬指出,我会尽快进行修改。
希望有帮到你呀:D

相同元素分配到相同空间问题(放鸡蛋问题)详解相关推荐

  1. 毫米波雷达系列 | 基于前后向空间平滑的MUSIC算法详解

    毫米波雷达系列 | 基于前后向空间平滑的MUSIC算法详解 文章目录 毫米波雷达系列 | 基于前后向空间平滑的MUSIC算法详解 DOA阵列模型 MUSIC算法 空间平滑算法 整体流程 仿真代码 忙了 ...

  2. linux查看根目录使用率,Linux 查看空间使用情况的实例详解

    Linux 查看空间使用情况的实例详解 在日常的Linux巡检中,我们会遇到文件系统目录使用空间很高的情况,例如如下利用"df -h "查看到根目录空间使用超过80%.而我们仅仅知 ...

  3. linux查看空间使用情况并且清除,科技常识:Linux 查看空间使用情况的实例详解...

    今天小编跟大家讲解下有关Linux 查看空间使用情况的实例详解 ,相信小伙伴们对这个话题应该也很关注吧,小编也收集到了有关Linux 查看空间使用情况的实例详解 的相关资料,希望小伙伴会喜欢也能够帮助 ...

  4. 没有执行此操作所需的足够可用空间。_一文详解 MySQL 高可用之 DRBD | 原力计划...

    作者 | wzy0623责编 | 屠敏出品 | CSDN 博客大多数MySQL高可用解决方案都是基于MySQL自带的各种复制技术.本质上是将一个实例上的数据更新或事务,在其它实例上进行重放,从而完成数 ...

  5. java 取栈顶元素_《Java实战之内存模型》详解篇

    内存是非常重要的系统资源,是硬盘和CPU的中间仓库及桥梁,承载着操作系统和应用程序的实时运行 JVM内存布局规定了Java在运行过程中内存申请.分配.管理的策略,保证了JVM的高效稳定运行 不同的JV ...

  6. oracle临时表空间地址,Oracle认证:详解OracleTemp临时表空间处理方法

    临时表空间主要用途是在数据库进行排序运算.管理索引.访问视图等操作时提供临时的运算空间,当运算完成之后系统会自动清理.当oracle里需要用到sort的时候,PGA中sort_area_size大小不 ...

  7. linux 交换空间(space space)详解

    内存和磁盘简介 正常的linux操作系统一般有两种内存,第一种就是我们熟知的RAM(random access memory),它是用来存储一段时间内频繁使用的数据和文档,电脑是不能直接读写非内存的东 ...

  8. oracle 修索引改空间_Oracle如何更改表空间的数据文件位置详解

    表空间概述 Oracle的表空间属于Oracle中的存储结构,是一种用于存储数据库对象(如:数据文件)的逻辑空间,是Oracle中信息存储的最大逻辑单元,其下还包含有段.区.数据块等逻辑数据类型.表空 ...

  9. ArcGIS实验教程——实验三十五:ArcGIS Model Builder与空间建模原理、案例详解

    ArcGIS实验视频教程合集:<ArcGIS实验教程从入门到精通>(附配套实验数据)> 文章目录 一. 空间建模概述 1. 空间建模概述 2. 空间建模步骤 二.Model Buil ...

最新文章

  1. 比特币的矿工为什么讨厌开发组Core?
  2. 谈谈对于企业级系统架构的理解(zz)
  3. web 小程序 ch2 第一个小程序
  4. 软件配置管理(五)常用重构技巧
  5. 地图 c-suite_C-Suite的模型
  6. 【报告分享】迈向更好的教育:未来教育的技术空间研究报告.pdf(附下载链接)
  7. Java怎么用继承回复信息_JAVA面向对象-继承
  8. 在JavaScript中生成特定范围内的随机整数?
  9. 求出0~999之间的所有“水仙花数”并输出。“水仙花数”是指一个三位数,其各位数字的立方和确好等于该数本身
  10. pix4d操作流程_利用精灵配合PIX4D软件制作正摄图片的简单制作流程
  11. PS薄纱飘带字体制作
  12. 如何在Vue.js和ElementUI框架中获取Collapse组件最后选中的值
  13. python 设置Pyplot的动态rc参数、绘图的填充
  14. 【问题】loadrunner运行场景时,用户卡在run状态,且退出时卡在gradual exiting状态
  15. Android 应用的动画实践--View Animation篇
  16. 微信小程序 18 播放记录和video页面初步搭建
  17. 20位诺奖得主齐聚一堂,世界科技创新论坛探讨未来
  18. CG.DYJ-顺序表比较
  19. IHS分析师:折叠屏幕手机2017年前难上市
  20. CleanMyMac X4.8许可证Crack Keygen

热门文章

  1. 安卓把word转为html,把Word转为简洁的html的若干种方法
  2. 力扣之917. 仅仅反转字母
  3. Mac下手动备份Mysql数据库
  4. 基于Leaflet的leaflet-sidebar侧边栏组件集成
  5. LintCode 2017 光棍节
  6. HTML+CSS实现导航条
  7. 一周学会linux实战笔记
  8. 6.前端CSS之布局属性(盒子,float,overflow,opsition,z-index,opacity)
  9. 电脑远程qq怎么连接服务器未响应,win10系统打开qq提示未响应需要联机检查的还原技巧...
  10. 【统计学】中心极限定理