整數拆分問題


整數分拆問題是一個古老而又十分有趣的問題。所謂整數的分拆 [1]   ,指將一個正整數表示為若干個正整數的和。不考慮其求和的順序,一般假定

滿足
正整數的一種拆分可以理解為將n個無區別的球放入n個無區別的盒子,每種方案就是一種拆分。
這篇博客
http://blog.chinaunix.net/uid-26548237-id-3503956.html
講的非常好,易於理解
 
一個用動態規划求解的辦法如下
 1 #include <cstdio>
 2 #include <cstring>
 3 int n;
 4 int dp[1002][1002];
 5 
 6 int main(int argc, char const *argv[])
 7 {
 8     memset(dp, 0, sizeof(dp));
 9     for(int i = 0; i < 1000; i++) {
10         dp[0][i] = 1;
11     }
12     for(int i = 1; i <= 102; i++) {
13         for(int j = 1; j <= 102; j++) {
14             if(j <= i) {
15                 dp[i][j] = dp[i][j-1] + dp[i-j][j];
16             }
17             else {
18                 dp[i][j] = dp[i][j-1];
19             }
20             
21         }
22     }
23     while(scanf("%d",&n) != EOF) {
24         printf("%d\n",dp[n][n]);
25     }
26     return 0;
27 }
28 /*
29 dp[3][1] = dp[3][0] + dp[2][1] = 1;
30 dp[3][2] = dp[3][1] + dp[1][2] = 1 + 1 = 2
31 dp[3][3] = dp[3][2] + dp[0][3] = 2 + 1 = 3
32 */

另一種辦法是母函數法


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM