【例题2-5】整数的划分

3 = 1 + 1 +1
3 = 2 + 1
3 = 3
则q(n,m)表示n的划分中最大值不超过m的方案书,q(3,3)=3.

【题解】

q(n,m)=q(n-m,m)+q(n,m-1);//放一个m在开头+不放m在开头然后尝试<=m-1
q(0,m)=1; ①
n<0 || m<=0 ->f(n,m)=0 ②
①在②前。

【代码】

#include <cstdio>
#define ll long long
using namespace std;

//计算n的划分个数,其中最大数不超过m
ll q(int n,int m){
    if (n==0) return 1;//0的划分只有一个,那就是它本身
    if (n<0 || m<=0) return 0;
    if (n<m) return q(n,n);
    return q(n-m,m) + q(n,m-1); //放一个m在开头+不放m了
}

int main(){
    int n,m;
    scanf("%d%d",&n,&m);
    printf("%lld\n",q(n,m));
    return 0;
}

原文地址:https://www.cnblogs.com/AWCXV/p/11619055.html

时间: 2024-10-12 02:55:05

【例题2-5】整数的划分的相关文章

整数的划分

整数的分划问题. 如,对于正整数n=6,可以分划为: 6 5+1 4+2, 4+1+1 3+3, 3+2+1, 3+1+1+1 2+2+2, 2+2+1+1, 2+1+1+1+1 1+1+1+1+1+1+1 现在的问题是,对于给定的正整数n,编写算法打印所有划分. 用户从键盘输入 n (范围1~10) 程序输出该整数的所有划分. 这个题目我用的递归,但是思路和我网上看到的不一样,貌似更简单一点, /** * 5=1+1+1+1+1     4=1+1+1+1 3=1+1+1 2=1+1    

1440:【例题1】数的划分

1440:[例题1]数的划分 类型 DFS  可行性剪枝  上下界剪枝 题解 为了防止TLE,那就不能简单暴搜 1.由于分解数字不考虑顺序,我们不如设定分解的数字依次递增,所以扩展节点时的下界>=前一个结点的值,也就是a[ i ] >= a[ i-1 ] 2.那么上界呢?假设已经分解出了k份,那么 i + 1 份不超过 n' /(m-k+1) 因为你已经分解了k份,还有m-k+1份待分解,但是这 m-k+1份的和为 n' ,因为始终保证分解出的序列非递减,那么,第k份最大就是平均数 代码 #i

递归与分治_整数的划分

#include <iostream> #include <cstdio> using namespace std; /* * 求整数n的划分 * n, m * 在整数n的所有划分中, 最大加数 n1<=m 的划分记做p(n, m); * 1. p(n, 1) = 1; (m == 1) * 2. p(n, n) = 1 + p(n, n-1); (n == m) * 3. p(1, m) = 1; (n == 1) * 4. p(n, m) = p(n, m-1) + p(

C/C++算法竞赛入门经典Page11 例题1-5 三整数排序

题目:输入3个整数,从小到大排序后输出 样例输入: 20 7 33 样例输出: 7 20 33 首先,先声明三个整数a,b,c和一个临时变量t: int a,b,c,t;//1,b,c为三个整数,t为临时变量 输入三个整数: scanf("%d%d%d",&a,&b,&c); 进行3次if判断: 1.如果b>a,则a,b对调 2.如果c>a,则a,c对调 3.如果c>b,则b,c对调 代码: if(b>=a){ t=b; b=a; a=t

HDU acm1028 整数划分 递归问题(递推)

我们用递归+记忆化的方法来解决普通整数划分问题:定义 f(n,m)为将整数n划分为一系列整数之和,其中加数 最大不超过m. 得到下面的递推关系式: 当n==1 || m==1 只有一种划分,即 1 或者 1+1+1......+1 当m>n 显然,等价于 f(n,n) 当m==n 此时:我考虑加数包含m与否的两种情况: 1)划分不包含m,即f(n,m-1)---所有m-1的划分 2)划分包含 m,此时只有一种即 m 所以当m==n时,有 f(n,m)=f(n,m-1)+1 当m<n时, 1)包

HDU 1028 整数划分问题 DP

http://acm.hdu.edu.cn/showproblem.php?pid=1028 将一个正整数n划分成多个正整数的和,例如4可以划分为4,1 + 3,2 + 2,1 + 1 + 2, 1 + 1 + 1(1 + 3和3 + 1算作一种划分). 在网上找到了两种做法 方法1: dp[i][j] 的含义是将一个正整数i划分为j个整数的和有几种分法.转移方程很好写但是不太好想. 将此划分分为两种情况,划分中包括1和不包括1.若划分中包括1,则只需将剩余的整数i - 1划分成j - 1个整数

整数划分问题(仅仅显示种类数)

这边博客对于整数划分问题,仅仅要求求出对于每个整数可以划分的种类数,採用金典的递归的办法解决. #include<iostream> using namespace std; /* *整数划分问题(仅仅显示种类数) */ int GetIntDivision(int n,int m) { if(n==1&&m>=1) return 1; if(n>=1&&m==1) return 1; if(m>n) return GetIntDivision

母函数细致讲解

母函数又称生成函数.定义是给出序列:a0,a1,a2,.......ak,......,那么函数G(x)=a0+a1*x+a2*x2+......ak*xk称为序列a0,a1,a2,.......ak,......的母函数(即生成函数). 例如:序列1,2,3.......n的生成函数为:G(x)=x+2x2+3x3+........nxn.点此链接:百度百科 特别的当序列为:1,1,1,1,.......1,这个生成函数为:G(x)=x+x2+x3+.......+xn=(1-xn)/(1-x

五大常见算法策略——递归与分治策略

摘要:递归与分治策略是五大常见算法策略之一,分治策略的思想就是分而治之,即先将一个规模较大的大问题分解成若干个规模较小的小问题,再对这些小问题进行解决,得到的解,在将其组合起来得到最终的解.而分治与递归很多情况下都是一起结合使用的,能发挥出奇效(1+1>2),这篇文章我们将先从递归说起,再逐渐向分治过渡,主要讲解方式是通过9个例题来说明问题的,问题都是根据难度由简到难,由浅入深,对递归与分治能有个大概的了解雏形,当然最重要还是要做大量练习才能掌握. 1.递归 我们第一次接触递归一般都是在初学C语