整数拆分

整数划分问题是算法中的一个经典命题之一
 

所谓整数划分,是指把一个正整数n写成如下形式:

n=m1+m2+m3+....+mi;(其中mi为正整数,并且1<=mi<=n),则{m1,m2,m3,....,mi}为n的一个划分。

如果{m1,m2,m3,....,mi}中的最大值不超过m,即max{m1,m2,m3,....,mi} <= m,则称它属于n的一个m划分。这里我们记n的m划分的个数为f(n,m);

例如当n=4时,它有5个划分:{4}、{3,1}、{2,2}、{2,1,1}、{1,1,1,1};

注意:4=1+3和4=3+1被认为是同一个划分。

Python解法

ans = 0  # 存放解的数量

def divN(n, array):  # n是要拆分的整数,k是指解的下标(拆解后的第i个数字)
    global ans
    for num in range(1, n + 1):  # 从1开始尝试拆分
        # print(ans, array[1:], "num", num)
        if num >= array[-1]:
            array2 = array + [num]  # 讲这次拆分存放到array2数组中
            rest = n - num  # 剩下的是n-num
            # print(ans, array2[1:], rest, "num", num)
            if rest == 0:  # 如果没有剩下的,说明本次拆分结束
                ans += 1
                print(f'解法{ans:3}:', array2[1:])
            else:  # 如果有剩下的,继续求出array[k+1]
                divN(rest, array2)
div(10, [0])

解法  1: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
解法  2: [1, 1, 1, 1, 1, 1, 1, 1, 2]
解法  3: [1, 1, 1, 1, 1, 1, 1, 3]
解法  4: [1, 1, 1, 1, 1, 1, 2, 2]
解法  5: [1, 1, 1, 1, 1, 1, 4]
解法  6: [1, 1, 1, 1, 1, 2, 3]
解法  7: [1, 1, 1, 1, 1, 5]
解法  8: [1, 1, 1, 1, 2, 2, 2]
解法  9: [1, 1, 1, 1, 2, 4]
解法 10: [1, 1, 1, 1, 3, 3]
解法 11: [1, 1, 1, 1, 6]
解法 12: [1, 1, 1, 2, 2, 3]
解法 13: [1, 1, 1, 2, 5]
解法 14: [1, 1, 1, 3, 4]
解法 15: [1, 1, 1, 7]
解法 16: [1, 1, 2, 2, 2, 2]
解法 17: [1, 1, 2, 2, 4]
解法 18: [1, 1, 2, 3, 3]
解法 19: [1, 1, 2, 6]
解法 20: [1, 1, 3, 5]
解法 21: [1, 1, 4, 4]
解法 22: [1, 1, 8]
解法 23: [1, 2, 2, 2, 3]
解法 24: [1, 2, 2, 5]
解法 25: [1, 2, 3, 4]
解法 26: [1, 2, 7]
解法 27: [1, 3, 3, 3]
解法 28: [1, 3, 6]
解法 29: [1, 4, 5]
解法 30: [1, 9]
解法 31: [2, 2, 2, 2, 2]
解法 32: [2, 2, 2, 4]
解法 33: [2, 2, 3, 3]
解法 34: [2, 2, 6]
解法 35: [2, 3, 5]
解法 36: [2, 4, 4]
解法 37: [2, 8]
解法 38: [3, 3, 4]
解法 39: [3, 7]
解法 40: [4, 6]
解法 41: [5, 5]
解法 42: [10]

 C语言解法

(4条消息) 整数拆分问题的四种解法_NEWPLAN的专栏-CSDN博客_整数拆分
https://blog.csdn.net/u011889952/article/details/44813593

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值