1. 程式人生 > >動態規劃_百煉 4117 簡單的整數劃分問題

動態規劃_百煉 4117 簡單的整數劃分問題

出口 sta pre color 劃分 stack 大於 iostream 規劃

 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 }

動態規劃_百煉 4117 簡單的整數劃分問題