整數的所有不同分割數目 2023年2月15日

2021-09-25 08:41:42 字數 985 閱讀 2161

問題描述:把乙個正整數寫成若干個正整數的和。比如4=3+1,2+2,2+1+1,1+1+1+1,再加上自己,就一共有5種分割方式。

思路:求解4的所有分割方式,實際上就是求分割中以4為最大值而且和為4的所有分割方式,可以用p[4][4]來表示。抽象出來,就是p[n][m],表示分割中以m為最大值而且和為n的所有分割方式。那麼,就有以下幾種情況。

1.第一步當然是n==m,所以第乙個分割肯定是n本身了。最大值為n的分割肯定只有乙個,所以接下來,就要求p[n][m-1]了。歸納出來:p[n][m]=p[n][m-1]+1;

2.從第一步m-1後,n肯定是大於m了。所以,p[n][m]的分割中,要麼不含m,比如p[4][2],4可以分割成1+1+1+1,這就不含2。這樣的話最大值就是1,也就是m-1,所以這種情況歸納出來就是p[n][m-1];要麼 含乙個或以上m,比如2+2,這樣的話p[n][m]=p[n-m][m],或者p[n-2m][m]......因為剔除掉若干個m,數目是一樣的。

3.通過以上分析,可以很明顯的看出這個程式可以用遞迴寫出來。寫遞迴,關鍵的一點就是遞迴結束的條件。在這裡比較簡單,就是p[n][1]=1,p[1][m]=1了。還要注意,n

歸納一下,遞迴的詳細步驟如下:

1.n==1 || m==1    p[n][m]=1

2.n==m                p[n][n]=p[n][m-1]+1

3.n>m                  p[n][m]=p[n][m-1]+p[n-m][m]

4.n**如下:

1 #include 2

#define max 100034

int p[max][max]=;56

//prototype

7int process(int n,int

m);8

9int

main()

1018

19int process(int n,int

m)20

整數的所有不同分割數目 2023年2月15日

問題描述 把乙個正整數寫成若干個正整數的和。比如4 3 1,2 2,2 1 1,1 1 1 1,再加上自己,就一共有5種分割方式。思路 求解4的所有分割方式,實際上就是求分割中以4為最大值而且和為4的所有分割方式,可以用p 4 4 來表示。抽象出來,就是p n m 表示分割中以m為最大值而且和為n的...

力扣 1481 不同整數的最少數目

給你乙個整數陣列 arr 和乙個整數 k 現需要從陣列中恰好移除 k 個元素,請找出移除後陣列中不同整數的最少數目。示例 1 輸入 arr 5,5,4 k 1 輸出 1 解釋 移除 1 個 4 陣列中只剩下 5 一種整數。示例 2 輸入 arr 4,3,1,1,3,3,2 k 3 輸出 2 解釋 先...

js實現 不同整數的最少數目歸結

給定乙個整數陣列 arr 和乙個整數 k 現需要從陣列中恰好移除 k 個元素,請找出移除後陣列中不同整數的最少數目。輸入 arr 5,5,4 k 1輸出 1解釋 移除 1 個 4 陣列中只剩下 5 一種整數。輸入 arr 4,3,1,1,3,3,2 k 3 輸出 2 解釋 先移除 4 2 然後再移除...