递归打印整数划分

蓝桥杯打印一个数字的所有划分,

5

4+1

3+2,3+1+1

2+2+1,2+1+1+1

1+1+1+1+1

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<queue>
#include<map>
#include<math.h>
using namespace std;
#define N 110
#define ll long long
const int inf=0x7fffffff;
const double eps=0.0001;
void f(int n,int a[],int k)
{           //用数组存储每种划分的数字组合
    if(n<=0)
    {
        for(int i=0;i<k-1;i++)  //k为当前位置
        {
            printf("%d+",a[i]);
        }
        printf("%d\n",a[k-1]);
    }
    for(int i=n;i>0;i--)
    {
        if(k>0&&a[k-1]<i)  //后面的数字不能大于前面数字
            continue;       //防止重复
        a[k]=i;
        f(n-i,a,k+1);
    }
}
int main()
{
    int n;
    int a[N];
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    for(n=1;n<=10;n++)
    {
        f(n,a,0);
        puts("");
    }
    return 0;
}

  

时间: 2024-12-27 12:22:31

递归打印整数划分的相关文章

递归---NYOJ-90整数划分(一)

这个题理解了好大会才理解,看了网上的代码,不太理解,但是后来看了好几个人的, 大同小异吧,慢慢的就理解了. 思路: 递归函数的意思是, 将 n 划分为最大数为 m 的划分数, 可以分几种情况 1. 当n = 1 的时候, 这时候就是将1划分, 也就是递归的出口, 1 肯定只能划分为 1, 所以返回1 2. 当m = 1的时候, 最大的数为1, 所以只能全划分为1才行, 所以就一种,return 1; 3. 当n < m的时候, 一个数肯定不能划分为比他要大的数, 最大只能划分到它本身,所以只需要

递归---NYOJ-176 整数划分(二)和NYOJ-279队花的烦恼二

这道题目的递归思想和第一个题差不多, 主要思想是:func(n, m)的作用是将n划分为m个. 1. 如果n < m 的时候肯定是不能划分的,所以就返回0 2. 如果m = 1 或者 n = m 的时候,就一种划分方式 3. 如果n > m 的时候, 分为两种情况,一个是划分数中含有1, 一个是不含1, 所以含有1 的个数为func(n - 1, m - 1),意思就是从n去掉1,然后再划分m - 1个, 下面就是不含1的, func(n - m, m), 这个式子的意思为, 先取出m个1来,

递归,整数划分

如果{n1,n2,...,ni}中的最大加数s<=m,则称它属于n的一个m划分,这里我们记n的m划分的个数为f(n,m)问题转化为f(n,n); 1.f(1,m)=1; 2.f(n,1)=1; 3.如果n<m,f(n,m)=f(n,n); 4.f(n,n)=f(n,n-1)+1; 4.n>m,f(n,m)=f(n,m-1)+f(n-m,m); #include <stdio.h> int split(int n,int m) { if(n==1||m==1) return 1

整数划分递归模板

/* 整数划分问题是算法中的一个经典命题之一,有关这个问题的讲述在讲解到递归时基本都将涉及. 所谓整数划分,是指把一个正整数n写成如下形式: n=m1+m2+...+mi; (其中mi为正整数,并且1 <= mi <= n),则{m1,m2,...,mi}为n的一个划分. 如果{m1,m2,...,mi}中的最大值不超过m,即max(m1,m2,...,mi)<=m,则称它属于n的一个m划分.这里我们记n的m划分的个数为f(n,m); 例如但n=4时,他有5个划分,{4},{3,1},{

整数划分类型题目

整数划分 --- 一个老生长谈的问题: 1) 练练组合数学能力. 2) 练练递归思想 3) 练练DP 总之是一道经典的不能再经典的题目: 这道好题求: 1. 将n划分成若干正整数之和的划分数. 2. 将n划分成k个正整数之和的划分数. 3. 将n划分成最大数不超过k的划分数. 4. 将n划分成若干奇正整数之和的划分数. 5. 将n划分成若干不同整数之和的划分数. 1.将n划分成不大于m的划分法:  1).若是划分多个整数可以存在相同的:  dp[n][m]= dp[n][m-1]+ dp[n-m

【递归】地盘划分 暴力

问题 W: [递归]地盘划分 修罗王和邪狼被关进监狱,该监狱的地下秩序实际被不少暗势力所把持,这些暗势力根据其实 力不同,划分出了大大小小的势力范围.具体划分方式是这样的:监狱是一个给定的矩形,每一个暗势力的势力范围都必须是一个正方形,划分时,最大的暗势力尽 可能多地从矩形中划分一块正方形,接下来,第二大的暗势力在剩下的矩形中尽可能多的划分一块正方形……例如,图2.1中所示是一个3×4的矩阵,可最少划 分为4个势力范围. 也就是说,取走一个3×3的正方形后,将问题规模变成3×1,然后变成2×1,

NYOJ-571 整数划分(三)

此题是个非常经典的题目,这个题目包含了整数划分(一)和整数划分(二)的所有情形,而且还增加了其它的情形,主要是用递归或者说是递推式来解,只要找到了递推式剩下的任务就是找边界条件了,我觉得边界也是非常重要的一步,如果找不准边界,这个题也很难做出来,当时我就是找边界找了好长时间,边界得琢磨琢磨.递推步骤如下: 第一行:将n划分成若干正整数之和的划分数.状态转移方程:dp[i][j]:和为i.最大数不超过j的拆分数dp[i][j]可以分为两种情况:1.拆分项至少有一个j 2.拆分项一个j也没有dp[i

算法笔记——整数划分3

题目来源:POJ1664-放苹果 和POJ3014 问题描述: 把m个同样的苹果放在n个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法. 输入: 第一行是测试数据的数目t(0 <= t <= 20).以下每行均包含二个整数m和n,以空格分开.1<=m,n<=10. 输出: 对输入的每组数据m和n,用一行输出相应的K. 分析: 问题描述转换成整数划分形式:把一个正整数m分成至多n个正整数的和,有多少种分法? 假设用f(m,

hdu 1028 Ignatius and the Princess III 【整数划分】

Ignatius and the Princess III                                                                                       Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 15730    Accepted Submission(