Dollar Days POJ 3181 完全背包+高精度

来源:互联网 发布:香港手机网络运营商 编辑:程序博客网 时间:2024/05/17 09:30

这个和之前的Sumsets差不多,都是完全背包的模板题
但是这个我们要注意的是数的范围比较大,已经超了long long 了,我们需要用到高精度
参考http://www.cnblogs.com/kuangbin/archive/2012/09/20/2695165.html

模拟高精度加法

#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>#include <cmath>using namespace std;const int maxn = 1005;long long dp[maxn][100];void ADD(int n,int m){    for(int i=0;i<=60;i++)    {        dp[n][i]+=dp[m][i];        if(dp[n][i]>=10)        {            dp[n][i]=dp[n][i]%10;            dp[n][i+1]++;        }    }}int main(){    int n,k;    scanf("%d %d",&n,&k);    dp[0][0]=1;    for(int i=1;i<=k;i++)    {        dp[0][0]=1;        for(int j=i;j<=n;j++)            ADD(j,j-i);    }    int t=60;    while(t>0&&dp[n][t]==0) t--;    for(int i=t;i>=0;i--) printf("%d",dp[n][i]);    printf("\n");    return 0;}

或者用两个long long 来实现

#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>#include <cmath>using namespace std;const int maxn = 1005;long long a[maxn];long long b[maxn];const long long inf=1e18;int main(){    int n,k;    scanf("%d %d",&n,&k);    b[0]=1;    for(int i=1;i<=k;i++)    {        for(int j=i;j<=n;j++)        {            a[j]=a[j]+a[j-i]+(b[j]+b[j-i])/inf;            b[j]=(b[j]+b[j-i])%inf;        }    }   if(a[n]==0) printf("%I64d\n",b[n]);   else printf("%I64d%018I64d\n",a[n],b[n]);    return 0;}

这里的a表示高位,b表示低位,当a不为0,b又没有到18位的时候记得要补0

0 0