問題描述:把乙個正整數寫成若干個正整數的和。比如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 然後再移除...