遞推關係的確定
設n的「最大零數不超過m」 的分劃式個數為q(n, m),這裡m<=n,則
q(n,n)=1+q(n, n-1)
等式右邊的「1」表示n等於n本身;q(n,n-1)表示n的所有其他分劃,即最大零數不超過n-1的分劃。
q(n,m)=q(n,m-1)+q(n-m,m) (1其中q(n,m-1)表示零數中不包含m的分劃式數目;q(n-m,m)表示零數中包含m的分劃數目,因為如果確定了乙個分劃的零數中包含m,則剩下的部分就是對於n-m進行不超過m的分劃。
注意:如果n-m使用遞推方法
// 整數分劃遞推計數
#include #include int main()
for (n = 2; n <= s; n++)
q[n][n] = q[n][n - 1] + 1; // 加上n=n這乙個分劃式
} printf("整數%d的分劃種數:%ld\n", s, q[s][s]);
return 0;
}
改進:現在要求整數只能拆分成1,2,4,10,20,40,100,200,400,1000,2000這11個數
使用遞推方法:
b[i]為第i種貨幣含5分硬幣的數量(1<=i<=11)
m[i][j]用前i種貨幣構成j個5分硬幣的方案數,前i種貨幣構成j個5分硬幣的方式數是在前i-1種貨幣基礎上構成
**如下:
public class demo2 ;
int target ;
public demo2(int target)
public int compute()
} return m[b.length][target] ;
} public static void main(string args)
}
整數的拆分
母函式將問題轉換為關於母函式的某種代數問題甚至變成關於母函式的某種形式的運算,以整數拆分為例.所謂的整數拆分,即將正整數n分解成 若干正整數的和,不考慮其求和的順序,一般假定 n n 1 n 2 cdots n k,n 1 geq n 2 geq n 3 geq cdots geq n k 而且分解...
整數的拆分
引自 華師大oj 1009 問題描述 將正整數n表示成一系列正整數之和 n n1 n2 nk,其中n1 n2 nk 1,k 1。正整數n的這種表示稱為正整數n的劃分。求正整數n的不 同劃分個數。例如正整數6有如下11種不同的劃分 6 5 1 4 2,4 1 1 3 3,3 2 1,3 1 1 1 2...
整數的拆分
整數拆分分為有序拆分和無序拆分 有序拆分 把n拆分為 r個數,就相當於把n個球用 r 1塊隔板插入到n 1個空隙裡 c r 1,n 1 放球模型,把n個無區別的球放入到r個有區別的盒子裡,每個盒子至少乙個。無序拆分 把n拆分為 r個數,把n個相同的球放入到r個相同的盒子裡,允許盒子為空。把n個相同的...