经典递归集合

1.放苹果--[①2020-02-07]

题目大意:他一共有n个口罩和m个盒子,每个盒子可以放任意个口罩(允许空着) 现在他想问你一共有多少种放口罩的方案? Hint: 1 2 2 和 2 1 2 是同一种分配方案

分情况讨论:

1.n=0,没有口罩,那么只有一种放法,即f(0,m)=1

2.m=1,只有一个盒子中,不论有或者无口罩,那么只有一种放法,f(n,1)=1

3.m>n,和m个口罩放在m个盒子中是一样的,即f(n,m)=f(n,n)

4.n>=m,这时分为两种情况,一是所有盒子都有口罩,二是不是所有盒子都有口罩

递归解析:    以后做题就从此图的思路进行思考

//#include<bits/stdc++.h>
#include<iostream>
using namespace std;

int f(int n,int m)
{
    if(n==0||m==1) return 1;
    if(n<m) return f(n,n);
    else return f(n-m,m)+f(n,m-1);
}
int main()
{
    int T;cin>>T;
    while(T--){
        int n,m;cin>>n>>m;
        int sum=f(n,m);
        cout<<sum<<endl;
    }
}

原文地址:https://www.cnblogs.com/waryan/p/12273824.html

时间: 2024-12-24 00:45:58

经典递归集合的相关文章

经典递归问题总结

   深入了解和掌握递归问题是一个高效程序员的基本素养,无论在平时课程学习或者竞赛中,递归思想的地位举足轻重,故在此对一些经典递归问题进行一些总结. (1)  计算一个数组中元素的累加和 #include<stdio.h>   intaddAll(int a[],int begin,int end); intmain(){ int a[6]={3,5,1,6,34,67}; int sum=0; //计算a数组的累加和 sum=addAll(a,0,5);  printf("%d\n

从&quot;汉诺塔&quot;经典递归到JS递归函数

前言 参考<JavaScript语言精粹> 递归是一种强大的编程技术,他把一个问题分解为一组相似的子问题,每一问题都用一个寻常解去解决.递归函数就是会直接或者间接调用自身的一种函数,一般来说,一个递归函数调用自身去解决它的子问题. "汉诺塔"经典递归问题 "汉诺塔"是印度的一个古老传说,也是程序设计中的经典的递归问题,是一个著名的益智游戏: 题目如下: 塔上有三根柱子和一套直径各不相同的空心圆盘,开始时源柱子上的所有圆盘都按从大到小的顺序排列.目标是通过

经典递归问题

运用递归解决问题的要点: (1)缩小问题规模(将问题分为若干步,注意构造问题间的相似性) (2)分析递归出口 下面从一些经典的实例来分析递归问题的特征 1.从n个小球中取m个,问有多少种取法? 1 #include <iostream> 2 using namespace std; 3 4 int f(int n,int m){ 5 if(n<m) return 0; 6 if(m==0) return 1; 7 return f(n-1,m)+f(n-1,m-1); 8 } 9 int

递归算法及经典递归例子代码实现( 转自http://www.cnblogs.com/joinclear)

递归(recursion):程序调用自身的编程技巧. 递归满足2个条件: 1)有反复执行的过程(调用自身) 2)有跳出反复执行过程的条件(递归出口) 递归例子: (1)阶乘 n! = n * (n-1) * (n-2) * ...* 1(n>0) //阶乘 int recursive(int i) { int sum = 0; if (0 == i) return (1); else sum = i * recursive(i-1); return sum; } (2)河内塔问题 //河内塔 v

递归算法及经典递归例子代码实现

转自http://www.cnblogs.com/joinclear/archive/2013/02/06/2908247.html 递归(recursion):程序调用自身的编程技巧. 递归满足2个条件: 1)有反复执行的过程(调用自身) 2)有跳出反复执行过程的条件(递归出口) 递归例子: (1)阶乘 n! = n * (n-1) * (n-2) * ...* 1(n>0) //阶乘 int recursive(int i) { int sum = 0; if (0 == i) return

经典递归小程序--汉诺塔

#include <stdio.h> /* 思路:1.将1到n-1号盘子借助C移到B上 2.将n号盘子移到C上 3.将1到n-1号盘子借助A移到C上 */ //初始化步数 int i = 0; void move(int,char,char); void hannuota(int,char,char,char); void main(void){ int n; printf("请输入汉诺塔盘子的个数:"); scanf("%d",&n); han

算法设计方法:递归的内涵与经典应用

摘要: 大师 L. Peter Deutsch 说过:To Iterate is Human, to Recurse, Divine.中文译为:人理解迭代,神理解递归.毋庸置疑地,递归确实是一个奇妙的思维方式.对一些简单的递归问题,我们总是惊叹于递归描述问题的能力和编写代码的简洁,但要想真正领悟递归的精髓.灵活地运用递归思想来解决问题却并不是一件容易的事情.本文剖析了递归的思想内涵,分析了递归与循环的联系与区别,给出了递归的应用场景和一些典型应用,并利用递归和非递归的方式解决了包括阶乘.斐波那契

Binary Tree Inorder/Preorder Traversal 返回中序和前序/遍历二叉树的元素集合

给定一个二叉树,以集合方式返回其中序/先序方式遍历的所有元素. 有两种方法,一种是经典的中序/先序方式的经典递归方式,另一种可以结合栈来实现非递归 Given a binary tree, return the inorder traversal of its nodes' values. For example:Given binary tree {1,#,2,3}, 1 2 / 3 return [1,3,2]. OJ's Binary Tree Serialization: The ser

汉诺塔问题(递归之路)

经典递归问题----汉诺塔问题 #include <stdio.h>#include <stdlib.h> void move(int i, int from, int to){ printf("move %d from %d to %d\n", i, from, to);}void hanoi(int n, int from, int help, int to){ //use 'help' to move 'from' to 'to'. if(n == 1){