雙條件的整數拆分問題,而且題主給的範圍不大,似乎還是藉助計算機的列舉比較快。格式為(和,方案數):(0,1) (10,29) (20,98) (30,66) (40,7)。分別介紹一下兩種單條件情況。一、將正整數i拆分為j個正整數(不計順序,可以重複)設dp(i,j)為方案數。分四種情況討論:
雙條件的整數拆分問題,而且題主給的範圍不大,似乎還是藉助計算機的列舉比較快。格式為(和,方案數):(0,1) (10,29) (20,98) (30,66) (40,7)。分別介紹一下兩種單條件情況。一、將正整數i拆分為j個正整數(不計順序,可以重複)設dp(i,j)為方案數。分四種情況討論:
i<j,此時沒有任何方案可以滿足條件(比如5不能分成6個正整數之和),dp(i,j)=0。i=j,此時只有一種方案,即每一個數都是1,dp(i,j)=1。j=1,此時只有一種方案,即數i本身,dp(i,j)=1。i>j 且 j≠1,此時可以繼續分兩種情況討論:若拆分中含有數1,那麼將1分離,相當於數i-1拆分為j-1個數,dp(i,j)=dp(i-1,j-1);若拆分中不含數1,那麼將拆分的每項均減1,相當於數i-j拆分為j個數,dp(i,j)=dp(i-j,j)。故此時dp(i,j)=dp(i-1,j-1)+dp(i-j,j)。利用此遞迴函式可求解。二、將正整數i拆分為不大於k的正整數(不計順序,可以重複)設dp(i,k)為方案數。分四種情況討論:i<k,i不可能拆分得到比i還大的正整數,此時dp(i,k)=dp(i,i)。k=1,此時只有一種方案,即每一個數都是1,dp(i,k)=1。i=k 且 k≠1,此時可繼續分兩種情況討論:若拆分中含有數k,那麼只有一種情況,即數i本身,dp(i,k)=1;若拆分中不含數k,那麼相當於拆分的最大數為k-1,dp(i,k)=dp(i,k-1)。故此時dp(i,k)=1+dp(i,k-1)。i>k 且 k≠1,此時可繼續分兩種情況討論:若拆分中含有數k,那麼將k分離,相當於數i-k拆分為不大於k的正整數,dp(i,k)=dp(i-k,k);若拆分中不含數k,那麼相當於拆分的最大數為k-1,dp(i,k)=dp(i,k-1)。故此時dp(i,k)=dp(i-k,k)+dp(i,k-1)。利用此遞迴函式可求解。注意這裡為了方便取的是正整數,對於自然數的問題,也可以一樣分析,將每項加1即可(例如0-9取5個數等於10,等價於1-10取5個數等於15)。這兩種單條件情況在計算機上均很容易實現,程式碼這裡就不贅述了,如有需要可評論中說明,答主會將其附上。而且特別要說明的是,這只是解決此問題的相對簡單的一種方法,使用母函式等方法,亦可得到答案。對於雙條件情況,答主暫時沒有發現類似單條件的簡單的遞迴方法,反而是列舉法比較簡單易行。如果哪位知友有更好的方法,歡迎探討。