poj 3181 把n 划分成 不大于m的若干数字 最大的划分方法 (dp +大数)
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 int dp[1002][26]; 6 int n,k; 7 int main() 8 { 9 while(scanf("%d%d",&n,&k)>0) 10 { 11 memset(dp,0,sizeof(dp)); 12 //dp[1][25]=1; 13 dp[0][25]=1; 14 for(int i=1; i<=k; i++) 15 for(int j=i; j<=n; j++) 16 { 17 for(int m=25; m>=0; m--) 18 { 19 20 dp[j][m]+=dp[j-i][m]; 21 if(dp[j][m]>=10000) 22 { 23 dp[j][m-1]+=dp[j][m]/10000; 24 dp[j][m]=dp[j][m]%10000; 25 } 26 } 27 } 28 int i=0; 29 while(dp[n][i]==0) 30 i++; 31 printf("%d",dp[n][i]); 32 i++; 33 for(; i<=25; i++) 34 printf("%04d",dp[n][i]); 35 printf("\n"); 36 } 37 return 0; 38 }