7-14 整数拆分——递归/推

本文介绍了一种高效解决整数n拆分成最大数为k的不同拆分方案问题的方法,从递归到递推转换,以避免递归带来的时间复杂度过高问题。通过实例演示和关键代码实现,探讨了如何在n=100范围内快速求解所有不重复的拆分方案数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给定一个整数n,将其无序拆分成最大数为k的拆分数,(n,k不超出100)
要求:所有的拆分方案不重复。
如当n=4,k=4时,一共有5种拆分方案,拆分如下:

(1)4=1+1+1+1
(2)4=1+1+2
(3)4=1+3
(4)4=2+2
(5)4=4
输入格式:
每一行输入一组整数n,k,遇到键盘结束符^Z或文件结束符EOF时结束输入。

输出格式:
按行输出每组的拆分方案数。

输入样例:
4,4
5,4
输出样例:
5
6

分析

思路:

  1. n == 1 || k == 1,拆分只有一种情况
  2. n < k,相当于拆分f(n,n)
  3. n == k,n可以拆分为包含k的式子,只有1种方法;也可以不包含k,那就是拆分f(n,k-1);两种方案相加
  4. n > k,n也是可以拆分为包含k的式子,有f(n-k,k)种方法;也可以不包含k,那就是拆分为f(n,k-1);两种方案相加

递归(TLE)

直接递归TLE,毕竟n=100左右呢,递归都爆栈,但是在这个题的思想重要;

#include<bits/stdc++.h>

using namespace std;

int f(int n, int k) {
    if (n == 1 || k == 1) {
        return 1;
    } else if (n < k) {
        return f(n, n);
    } else if (n == k) {
        //包含k就1种,不包含k
        return f(n, k - 1) + 1;
    } else {//n>k
        //包含k,不包含k
        return f(n - k, k) + f(n, k - 1);
    }
}

int main() {
    int n, k;
    while (cin >> n) {
        getchar();
        cin >> k;
        cout << f(n, k) << endl;
    }
    return 0;
}

递推(AC)

把上面递归转化为递推(dp),暴力枚举每种情况计算即可;

#include<bits/stdc++.h>

using namespace std;

int f[105][105];

void solve(int n, int k) {
    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= k; ++j) {
            if (i == 1 || j == 1) {
                f[i][j] = 1;
            } else if (i < j) {
                f[i][j] = f[i][i];
            } else if (i == j) {
                f[i][j] = f[i][j - 1] + 1;
            } else {
                f[i][j] = f[i - j][j] + f[i][j - 1];
            }
        }
    }
}

int main() {
    int n, k;
    while (cin >> n) {
        getchar();
        cin >> k;
        solve(n, k);
        cout << f[n][k] << endl;
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

向上的yyy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值