栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

动态规划解决整数拆分

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

动态规划解决整数拆分

给定一个正整数,我们可以定义出下面公式:

N = a[1] + a[2] + a[3] + ... +a[m];

a[i] > 0, 1<= m <= N;

对于一个正整数,求满足上面公式所有算式组合,如对于整数4:

4 = 4;

4 = 3 + 1;

4 = 2 + 2;

4 = 2 + 1 + 1;

4 = 1 + 1 + 1 + 1;

所以上面结果是5。

注意:对于"4 = 3 + 1"和 "4 = 1+ 3",这两处实际上是同一种组合。

题解:采用动态规划法求f(n, n),利用二维数组求f(n, m)。这个函数的意思就是将n划分为最多m个整数有多少种组合。

根据n和m的关系,考虑下面几种情况:

(1)当n=1或者m=1时,只有一种划分。例如:将1划分为最多2个数只能是1=1或者将5划分为最多1个数5=5。

(2)当n=m时,根据划分中是否包含n,可以分为两种情况:

划分中包含n的情况,只有一个。例如:将4划分为4=1+1+1+1此时只有一种划分。
划分中不包含n的情况,此时划分的个数最多就是n-1;即f(n,n-1)。

(3)当n

(4)当n>m时,根据划分中是否包含m,可以分为两种:

当必须划分为m个数时,由于n>m。(这里就相当于有四个苹果要放入三个盘子,每个盘子至少要放一个苹果。)所以在划分的每一位上至少是1。即:f(n-m,m)。

当划分的个数不包括m时,即为:f(n,m-1)。

这里用4为例:

1234
11111
21222
31233
41345

​
int main()
{ 
    int n = 0;
    scanf("%d",&n);
    int t[100][100];
    for (int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            if(i==1||j==1){
                t[i][j] = 1;
            }else{
                if(j==i){
                    t[i][j] = t[i][j-1]+1; 
                }else if(i 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/971269.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号