求正整數n所有可能的和式的組合

2021-06-16 09:10:11 字數 881 閱讀 9346

問題背景:求正整數n所有可能的和式的組合(如;4=1+1+1+1、1+1+2、1+3、2+1+1、2+2)

對於這個題目有兩種理解了:

一》 如果將1+1+2和2+1+1當成不同的序列的話,這個問題會相對容易些。

拿n=4這個例子,首先最長的組合肯定是4=1+1+1+1,那麼最短的組合是4=4,到最後可能會將4=4這種情況排除掉,所以所有組合的長度一定為1,2,3,4。

下面我們從長度為4即=1+1+1+1這個組合來生成長度為3的序列,那麼即是從1,1,1,1這4個1中選擇兩個+號位置,並將兩個+號位置之前的所有1的和作為乙個加法項,即組合會有1,1+1+1 , 1+1,1+1和1+1+1,1即分別為2+1+1,1+2+1和1+1+2三種情況(採用插桿法)。長度為2的序列同理即在3個位置上選擇1位置填上+號。

那麼上面的計算可以得到乙個組合數為c(3,0) + c(3,1) + c(3,2) + c(3,3) = 2^3個組合。如果4=4不算,則組合序列有2^3 - 1個,那麼對於n則有的個數為2^(n-1) - 1個。

二》 將如果將1+1+2和2+1+1當成相同的序列的話會有點tricky,不過可以使用下面的方法來解決

假設現在得到的乙個序列x的長度為n,那麼我們可以從這個序列來拓展出長度n-1的序列。

首先統計x中含有幾個不同的元素如1+1+2含有2個不同的元素1和2,將任意兩個不同的元素相加生成乙個新的元素p,用p來替換這個新的元素,這樣1+1+2可以拓展出1+3這個序列。

再者,如果某乙個元素出現我次數不少於2次,那麼就將這個元素的2倍作為乙個新的元素來替換掉兩個元素,這樣1+1+2可以生成2+2,因為1出現了再次。

注意從n長度生成n-1長度時可能需要進行排除重複的長度為n-1的序列,這個可以用乙個map或者 hash_table來排除。

求正整數n所有可能的和式的組合

求正整數n所有可能的和式的組合 如 4 1 1 1 1 1 1 2 1 3 2 1 1 2 2 首先說一下,群裡面很多人在問這個東東怎麼去列印,當然如果是只求組合個數的話,他就是乙個完全揹包的問題,如果要列印的話,那還真的費一番功夫。我們可以將這題想為乙個找零錢問題,以前找零錢問題是,我們有1元 2...

求正整數n所有可能的和式的組合

題目 給定乙個數字n,求解出所有和為n的整數組合,要求組合按照遞增方式展示,而且唯一。分析 最初看到這個題,沒有什麼特別好的思路,後來看了下別人的帖子,其實問題也沒那麼難,採用遞迴的方式進行求解,比如我們需要計算和為4的所有組合,我們首先將小於等於4的所有數字列出來 1,2,3,4 首先選取第乙個數...

求正整數n所有可能的和式的組合

題目 給定乙個數字n,求解出所有和為n的整數組合,要求組合按照遞增方式展示,而且唯一。分析 最初看到這個題,沒有什麼特別好的思路,後來看了下別人的帖子,其實問題也沒那麼難,採用遞迴的方式進行求解,比如我們需要計算和為4的所有組合,我們首先將小於等於4的所有數字列出來 1,2,3,4 首先選取第乙個數...