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 }

 

posted @ 2014-03-04 14:06  galaxy77  阅读(251)  评论(0编辑  收藏  举报