一开始看到题目,就写了一个完全背包,然后一直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 }