1. 程式人生 > >數列中和為定值的所有組合

數列中和為定值的所有組合

問題描述

輸入兩個整數 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

綜上,得以上演算法