动态规划例子
對于由從1到N (1 <= N <= 39)這N個連續的整數組成的集合來說,我們有時可以將集合分成兩個部分和相同的子集合。
例如,N=3時,可以將集合{1, 2, 3} 分為{1,2}和{3}。此時稱有一種方式(即與順序無關)。
N=7時,共有四種方式可以將集合{1, 2, 3, ..., 7} 分為兩個部分和相同的子集合:
{1,6,7} 和 {2,3,4,5}?
{2,5,7} 和 {1,3,4,6}?
{3,4,7} 和 {1,2,5,6}?
{1,2,4,7} 和 {3,5,6}?
輸入:程序從標準輸入讀入數據,只有一組測試用例。如上所述的N。
輸出:方式數。若不存在這樣的拆分,則輸出0。
對于從1到N的連續整集合,劃分為兩個子集合,且保證每個集合的數字和
是相等的。因而,劃分之后每個子集全的數字應該為n*(n+1)/2的一半,即n*(n+1)/4
由于兩個子集中都是整數,所以n*(n+1)必為偶數,則可以設s=n*(n+1),并判斷s%4 .
則,s/=4是劃分之后子集合的數字和;dyn[i]數組表示任意個數加起來等于i的組數*/
num[0][0]?保持中間值
1? 多階段最優子結構
2?重復計算子問題
狀態轉移方程?
i>j
num[i][j]?=?num[i-1][j]?+?num[i-1][j-i];??????????
?? else???????????????????? num[i][j]?=?num[i-1][j];?
代碼實現:
總結
- 上一篇: 《Java解惑》陷阱和缺陷的目录
- 下一篇: 后缀数组--处理字符串的利器