数列中和为定值的所有组合

来源:互联网 发布:2017年重庆网络春晚 编辑:程序博客网 时间:2024/05/17 01:50

问题描述

输入两个整数 n 和 m,从数列1,2,3……n中随意取几个数,使其和等于 m ,要求将其中所有的可能组合列出来。

算法

设该算法为f(m, n),返回一个数组集合r

则f(m, n-1)返回集合r1

且f(m-n, n-1)返回集合r2

在r2中的每个数组中加入元素n,得到r3

则r = r1 + r3

终止条件是n <= 0或m <= 0

算法思路

利用分治的思想,缩小问题规模,迭代解决问题

m是定值,n是标志规模的量,所以希望每次缩小n的规模(n-1)

那如何从n-1规模的问题答案中得到n规模的答案呢?

首先,(m, n-1)的答案是(m, n)的答案一个子集

其次,(m, n)的答案相对(m, n-1)的答案,多出了包含元素n的所有组合

如何求上述包含元素n的所有组合?只需要求出所有不含n且和为m-n的组合,然后各加入一个n既可

要求不含n,所以问题规模定义为n-1,要求和为m-n,所以参数定为m-n

综上,得以上算法


0 0
原创粉丝点击