正整數n的k拆分問題

2021-05-06 17:44:20 字數 717 閱讀 1622

演算法小菜鳥剛開始做poj,1664是乙個關於整數拆分的問題,即:

將正整數n拆分成k個不能整數的和,0<=k<=n,求有多少種差分方法。

比如:將7差分成3個不同整數的拆分法有8中,其中1,1,5和1,5,1屬於同一種拆分法。

該問題等同於:

將n個完全相同的物品放到k個完全相同的容器中,求有多少種方法。

由於小菜鳥數學不好,感覺是用遞推,但總是寫不出正確的遞推公式,於是google之:

如果我們用opt[i][j]表示把i拆成j個數(可為0)的方法數,則有如下方程成立:

opt[i][j] = opt[i][j-1] + opt[i-j][j]

邊界條件opt[0][j] = 0

解釋為,

(1)要麼第j個數為0,這樣就是opt[i][j-1],(存在被分配數為0的j)

(2)要麼所有的j被分配數都大於0(最小的j被分配的數大於0),我們可以把所有j個數都減1,於是得到opt[i-j][j]。

等同於:

①最少的盤子沒有放,這樣剩下的k-1個盤子還是隨便放n個

②最少的盤子放了乙個,這樣每個盤子至少乙個,k個盤子先放上k個,剩下的n-k個可以隨便放

可以做到空間為o(n)。**也很好寫。

將乙個正整數L隨機拆分成n個正整數

隨機指定範圍內n個不重複的數 最簡單最基本的方法 param min 指定範圍最小值 param max 指定範圍最大值 param n 隨機數個數 public static int randomcommon int min,int max,int n int result new int n i...

正整數n拆分成幾個不同的平方數 DFS 打表

考慮將正整數n拆分成幾個不同的平方數之和,比如30 1 2 2 2 5 2 1 2 2 2 3 2 4 2,而8不存在這樣的拆分。1 include2 using namespace std 34 const int maxn 1000 10 5 bool vis maxn 6 vectorres ...

整數拆分問題

問題 對於1個正整數n,將其拆分成幾個正整數的和,如何拆分可使得其乘積最大?csdn使用者pathuang68給出的結論是 如果不在乎是否為整數的話,那麼把每份平均分為e 2.71828459045.時,所得到的乘積是最大的,如果要是整數的話,那麼就選盡可能地靠近e的整數即可,比如3。具體證明請參見...