1 #define _CRT_SECURE_NO_WARNINGS 2 #include <stdio.h> 3 #include <math.h> 4 #include <algorithm> 5 #include <stdlib.h> 6 #include <vector> 7 #include <map> 8 #include <queue> 9 #include <string> 10 #include <iostream> 11 #include <ctype.h> 12 #include <string.h> 13 #include <set> 14 #include <stack> 15 #include<functional> 16 using namespace std; 17 #define Size 55 18 #define maxn 1<<30 19 int dp[Size][Size]; 20 /* 21 dp[i][j] 表示将i分解成不大于j的能分解的个数 22 dp[i][j]=dp[i][j-1]+dp[i-j][j]//因为数字可以重复 那么即使去掉了一个j 那么最大的数还有可能是j 23 当i-j<0 dp[i][j]=dp[i][j-1] 24 出口 25 dp(1,1)=1=dp(1,0)+dp(0,1) 26 dp(2,1)=1(1,1)=dp(2,0)+dp(1,1) 27 所以dp(i,0)=0 dp(0,j)=1; 28 */ 29 int solve(int n, int m){ 30 if (dp[n][m] != -1) return dp[n][m]; 31 if (n == 0) { 32 dp[n][m] = 1; 33 return 1; 34 } 35 if (m == 0) { 36 dp[n][m] = 0; 37 return 0; 38 } 39 if (m > n) { 40 dp[n][m]= solve(n, m-1); 41 return dp[n][m]; 42 } 43 44 dp[n][m]=solve(n , m-1) + solve(n-m, m); 45 return dp[n][m]; 46 47 } 48 int main(){ 49 int n; 50 while (cin >> n){ 51 for (int i = 0; i <= n; i++) 52 for (int j = 0; j <= n; j++) 53 dp[i][j] = -1; 54 cout << solve(n, n) << endl; 55 } 56 system("pause"); 57 return 0; 58 }