POJ 3181 Dollar Dayz

一开始看到题目,就写了一个完全背包,然后一直wa,百度一下,蛋疼的是 结果是大数

模拟高精度

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<string>
 5 #include<set>
 6 #include<vector>
 7 #include<map>
 8 #include<algorithm>
 9 #include<cmath>
10 #include<stdlib.h>
11 using namespace std;
12 int  need,dp1[1010][100];
13 void add(int x,int y)
14 {
15     for(int i=0;i<50;i++)
16     {
17         dp1[x][i]+=dp1[y][i];
18         while(dp1[x][i]>=10)
19         {
20             dp1[x][i+1]++;
21             dp1[x][i]-=10;
22         }
23     }
24 }
25 int main()
26 {
27     int k,i,j;
28     while(cin>>need>>k)
29     {
30         memset(dp1,0,sizeof(dp1));
31         dp1[0][0]=1;
32         for(i=1; i<=k; i++)
33             for(j=i;j<=need;j++)
34                add(j,j-i);
35        for(i=49;i>=0;i--)
36        if(dp1[need][i]!=0)
37        {
38            for(j=i;j>=0;j--)
39            cout<<dp1[need][j];
40            cout<<endl;
41            break;
42        }
43     }
44 }

在网上看到用两个长整型的数来表示一个大数,无耻地敲了一下

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<string>
 5 #include<set>
 6 #include<vector>
 7 #include<map>
 8 #include<algorithm>
 9 #include<cmath>
10 #include<stdlib.h>
11 using namespace std;
12 const long long inf=1000000000000000000;
13 long long  need,dp1[1010],dp2[1010];
14 int main()
15 {
16     int k,i,j;
17     while(cin>>need>>k)
18     {
19         memset(dp1,0,sizeof(dp1));
20         memset(dp2,0,sizeof(dp2));
21         dp2[0]=1;
22         for(i=1; i<=k; i++)
23         {
24             for(j=i;j<=need;j++){
25                dp1[j]+=dp1[j-i]+(dp2[j-i]+dp2[j])/inf;
26                dp2[j]=(dp2[j-i]+dp2[j])%inf;
27             }
28         }
29         if(dp1[need]==0)
30         cout<<dp2[need]<<endl;
31         else
32         cout<<dp1[need]<<dp2[need]<<endl;
33     }
34 }

 

posted on 2014-07-15 09:48  天凉了  阅读(119)  评论(0编辑  收藏  举报

导航