通过递归算法, 求解正整数M的组合

#include <stdio.h>
#include <stdlib.h>

int Sum(int *buff, int len)
{
    int sum = 0;
    for (int i = 0; i < len; i++) {
        sum += buff[i];
    }
    return sum;
}

void Print(int *buff, int len)
{
    for (int i = 0; i < len; i++) {
        printf("%d ", buff[i]);
    }
    // printf("\n");
}

int Perm(int *buff, int *len, int start, int m, int *count)
{
    int sum = Sum(buff, *len);
    int min = ((m - sum) < start) ? (m - sum) : start;
    for (int i = min; i > 0; i--) {
        if ((sum + i) == m) {
            (*count)++;
            Print(buff, *len);
            printf("%d\n", i);
            continue;
        }

        buff[*len] = i;
        (*len)++;

        Perm(buff, len, i, m, count);
        (*len)--;
    }
}

int main()
{
    int buff[10] = {0};
    int len = 0;
    int count = 0;
    int n;
    scanf("%d", &n);
    Perm(buff, &len, n, n, &count);
    printf("n = %d, count = %d\n", n, count);
    return 0;
}

  

原文地址:https://www.cnblogs.com/felixr/p/11407945.html

时间: 2024-11-02 03:22:47

通过递归算法, 求解正整数M的组合的相关文章

递归求解几类排列组合问题(一、类循环组合排列)

对于搜索的深度很深或深度不固定的情况,则无法用枚举的方法来设置循环嵌套的层数,这时可以考虑用递归法来完成搜索任务.递归是一种常用算法,它是搜索的另一种实现方式.如果在算法设计中采用一个函数或过程直接或间接地调用它自身来解决问题的方法,则称该方法为递归算法.递归算法必须要设计好一个或若干个确定的递归终止条件. 一.类循环组合排列 Sample Input : 4 2 Sample Output 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 10

递归求解几类排列组合问题(二、全组合排列)

对于搜索的深度很深或深度不固定的情况,则无法用枚举的方法来设置循环嵌套的层数,这时可以考虑用递归法来完成搜索任务.递归是一种常用算法,它是搜索的另一种实现方式.如果在算法设计中采用一个函数或过程直接或间接地调用它自身来解决问题的方法,则称该方法为递归算法.递归算法必须要设计好一个或若干个确定的递归终止条件. Sample Input 3 1 2 3 Sample Output 123 132 213 231 312 321 #include<stdio.h> #include<strin

递归求解几类排列组合问题(三、非重复组合排列)

三.非重复组合排列(含重复数字时,生成不重复组合排列) 对于搜索的深度很深或深度不固定的情况,则无法用枚举的方法来设置循环嵌套的层数,这时可以考虑用递归法来完成搜索任务.递归是一种常用算法,它是搜索的另一种实现方式.如果在算法设计中采用一个函数或过程直接或间接地调用它自身来解决问题的方法,则称该方法为递归算法.递归算法必须要设计好一个或若干个确定的递归终止条件. Sample Input 4 1 2 2 3 Sample Output 1223 1232 1322 2123 2132 2213

递归求解几类排列组合问题(四、普通选择性组合排列)

四.普通选择性组合排列 对于搜索的深度很深或深度不固定的情况,则无法用枚举的方法来设置循环嵌套的层数,这时可以考虑用递归法来完成搜索任务.递归是一种常用算法,它是搜索的另一种实现方式.如果在算法设计中采用一个函数或过程直接或间接地调用它自身来解决问题的方法,则称该方法为递归算法.递归算法必须要设计好一个或若干个确定的递归终止条件. Sample Input 5 3 1 2 3 4 5 Sample Output 123 124 125 134 135 145 234 235 245 345 #i

求解正整数拆分的计数问题

实例: 1.无序情况 2.有序情况 说明:首先要判断是有序的.无序的.有序 可以先求无序,再全排列. 接下来再判断是否重复,使用不同的公式. 摘自<离散数学屈婉玲教材> 来自为知笔记(Wiz) 求解正整数拆分的计数问题

递归算法求解遍历(或穷举)问题

递归问题可以理解为遍历问题,必须遍历出所有的数据来,才能进行相应的运算,比如Fibonacci问题.阶乘问题,必须把每一步的值都遍历出来,然后才能做加法或乘法. 递归算法解决问题的特点: (1) 必须有一个明确的递归结束条件,称为递归出口. (2) 根据当前状态的值推断下一个状态值的个数n与条件,本次递归调用将根据条件调用n个自身(根据条件,遍历不同分支,如二叉树中前序.中序和后序遍历). 递归算法优缺点:借助递归方法,我们可以把一个相对复杂的问题转化为一个与原问题相似的规模较小的问题来求解,递

(回溯法)和为n的所有不增正整数和式分解算法

利用递归算法输出正整数和为n的所有不增的正整数和式.例如当n=5时,不增的和式如下: 5=5 5=4+1 5=3+2 5=3+1+1 5=2+2+1 5=2+1+1+1 5=1+1+1+1+1 形如这种求子集的问题都可以采用回溯法来解决,回溯法即一种加上剪枝判断的递归算法. 解决问题的关键词:不增 代码实现如下: 数组a用来保存分解出来的和数,即某个分解的集合 sum表示需要分解的数 k表示要分解的第k个和数 #include <iostream> #include <stdio.h&g

递归求解二叉树任意一结点的深度

这个事最后一道大题的第一小题 让写个递归算法求解二叉树任意一结点的深度 首先应该去递归找到这个x结点,找到后然后再递归求解以x为根结点的子树的深度,所以我就很规矩(当然我觉得这样写比较明了)写了两个递归函数 当然首先还是得建立二叉排序树 另外注明:是用vs2010写的,没有在vc++6.0上面测试,如果朋友们发现在vc++上有bug,欢迎指出,供后来者看看 贴下自己的代码 //功能:递归算法,求二叉树中以元素值为x的结点为根的子树的深度 //时间:2014-11-23 #include <ios

【编程小题目1】求解斐波拉契数列问题

题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21.... 斐波那契数列又因数学家列昂纳多·斐波那契以兔子繁殖为例子而引入,故又称为“兔子数列”.Fibonacci 数列定义:n = 1,2 时,fib(n) = 1n > 2 时,fib(n) = fib(n-2) + fib(n-1) // 递归算法求解Fibonacci 数列 #i