1.允许空盒

问题描述

n个相同的小球,放入m个相同的盒子里,允许有空盒,问有多少种不同的方法?

解题思路

f(i,k) 表示把 i 个相同的小球放入 k 个相同的盒子中且允许有空盒的放法数。
(1) 把 i 个小球放入到 k 个盒子中,如果盒子数 k 比小球数i还要多,那么一定有空的盒子,这时只考虑 i 个盒子即可。
(2) 若盒子数不超过小球数,则对方法进行分类,分成两类:有盒子为空的放法和没盒子为空的放法。
(2.1) 有盒子为空的放法:先拿走一个盒子,把 i 个小球放入 k - 1 个盒子中,有f(i,k-1) 种放法。
(2.2) 没盒子为空的放法:先从 i 个小球中拿出 k 个,每个盒子先放一个,这样 k 个盒子中至少有 k 个小球了,剩下的 i - k 个小球,再放到 k 个盒子中,有**f(i-k, k)**种放法。

边界条件
5个小球放入1个盒子,显然只有一种放法,f(5, 1) = f(5, 0) + f(4, 1)。f(4, 1)也显然为1,于是f(5, 0)应该就是0。同样我们也可以分析出发f(1, 0) = 0。
1个小球放入1个盒子中,f(1, 1) = f(1, 0) + f(0, 1),而f(0, 1)等于f(0, 0),它们都等于1。

代码

#include<iostream>
using namespace std;
int f(int i, int j)
{if(i < j)return f(i, i);if(i == 0)return 1; //特别注意这两个出口条件的顺序,要是先判断k == 0就返回0.这样就错了if(j == 0)return 0;return f(i, j - 1) + f(i - j, j);
}
int main()
{int i, j;cin >> i >> j;cout << f(i, j) << endl;return 0;
}

2.不允许空盒

问题描述

n个相同的小球,放入m个相同的盒子里,不允许有空盒,问有多少种不同的方法?

解题思路

step表示当前剩余的小球需要分成的盒子数
把n分成k份,只需第⼀个盒子中小球数等于i,计算从i等于1⼀直到i等于n/k,然后把剩余的n-i分成k-1份的种类数…
pre为前一个小盒中的球数,每次i从pre开始⼀直到n/step结束,这样才能保证每个小盒中的小球数是不递减的,才能保证不会有重复的情况产⽣

代码

#include <iostream>
using namespace std;
int cnt = 0;
void dfs(int pre, int n, int step)
{if(step == 1) {cnt++;return;}for(int i = pre; i <= n / step; i++)dfs(i, n - i, step - 1);
}
int main() {int n, k;cin >> n >> k;dfs(1, n, k);cout << cnt << endl;return 0;
}

递归实现放小球(整数划分)问题相关推荐

  1. 4.1 基础-放苹果(整数划分)

    题目 题目描述 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法. 输入 每个用例包含二个整数M和N.0<=m ...

  2. 整数划分递归相关问题

    算法设计----整数划分递归相关问题 一.原问题 整数划分,是指把一个正整数n写成如下形式: 假设整数n,能被划分为i段n=a1+a2+...ai,其中ak为n中划分的最大整数(1<=ak< ...

  3. NYOJ90 整数划分(经典递归和dp)

    整数划分 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 将正整数n表示成一系列正整数之和:n=n1+n2+-+nk,  其中n1≥n2≥-≥nk≥1,k≥1.  正整数 ...

  4. 实验一 分治与递归—整数划分 java实现

    基本题一:基本递归算法 一.实验目的与要求 1.  熟悉Java语言的集成开发环境: 2.通过本实验加深对递归过程的理解 二.实验内容: 掌握递归算法的概念和基本思想,分析并掌握"整数划分& ...

  5. Bailian4117 简单的整数划分问题【整数划分+记忆化递归】

    4117:简单的整数划分问题 总时间限制: 100ms 内存限制: 65536kB 描述 将正整数n 表示成一系列正整数之和,n=n1+n2+-+nk, 其中n1>=n2>=->=n ...

  6. 整数划分c语言程序递归,递归整数划分

    递归实现整数划分 目录 递归实现整数划分 1.原理 2.Python实现 3.C实现 1.原理 拿6为例,可划分为: 6 5+1 4+2 4+1+1 3+3 3+2+1 3+1+1+1 2+2+2 2 ...

  7. java整数划分递归_整数划分问题(递归法)

    整数划分问题是算法中的一个经典命题之一,有关这个问题的讲述在讲解到递归时基本都将涉及.所谓整数划分,是指把一个正整数n写成如下形式: n=m1+m2+...+mi; (其中mi为正整数,并且1 < ...

  8. 整数划分的递归实现算法c语言,整数划分算法原理与实现

    整数划分问题是将一个正整数n拆成一组数连加并等于n的形式,且这组数中的最大加数不大于n. 如6的整数划分为 6 5 + 1 4 + 2, 4 + 1 + 1 3 + 3, 3 + 2 + 1, 3 + ...

  9. 【递归】整数划分(C++)

    一.什么是整数划分 所谓整数划分,是指把一个正整数n写成如下形式: n = m 1 + m 2 + ⋅ ⋅ ⋅ + m i n=m_1+m_2+···+m_i n=m1​+m2​+⋅⋅⋅+mi​: 其 ...

最新文章

  1. 假设写一段代码引导PC开机这段代码是 ? Here is a tiny quot;OSquot; :-D
  2. python 贴吧自动回复机-python借助wxpy与图灵实现微信机器人自动回复消息
  3. 位运算和进制转换,反码补码
  4. 2017.08.15【NOIP提高组】模拟赛B组 生日聚餐
  5. 90后的你,有什么赚钱方式?
  6. 循环小结的存在必然性的证明
  7. Python写数据结构:循环队列
  8. 【微服务直播】60分钟掌握微服务治理之道
  9. threejs编辑器(3D场景编辑器)
  10. 1×pbs缓冲液配方_PBS缓冲液配方.doc
  11. leaflet地图和飞线
  12. 项目实训第一周第三篇
  13. 传奇服务器开区修改,怎么修改传奇登陆器开区时间提前?
  14. 【行业介绍】工业自动化行业
  15. JZOJ ???? Or
  16. win10一直正在检查更新_win10补丁KB4587587推送 win10预览版20236.1005更新内容汇总_windows10_Windows系列_操作系统...
  17. MySQL安装教程(详细)
  18. pytorch(4)Pytorch模型训练时从CPU与GPU之间的转换
  19. c语言为什么scanf要取地址printf不用呢?
  20. ActiveSync 3.7

热门文章

  1. 华南师范大学计算机软件研究生院,华南师范大学研究生院
  2. 《Metasploit 魔鬼训练营》04 Web 应用渗透测试
  3. 通过虚拟机openwrt上网_vmware 12中安装 OpenWRT 及 网络配置
  4. 派克斯PacketiX 使用出现错误代码应该怎么解决
  5. cisco881配置连接计算机,cisco 881 无线路由配置
  6. 数据仓库和商业智能演进五个阶段
  7. Linux:Ubuntu系统的安装
  8. 【计算机毕业设计】冷冻仓储管理系统
  9. SystemOut.log中报错WLTC0017E
  10. 微信小程序开发:按Pages编译显示页面