演算法小菜鳥剛開始做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。具體證明請參見...