poj 3181 Dollar Dayz(完全背包)

来源:互联网 发布:宾得 知乎 编辑:程序博客网 时间:2024/04/28 06:45

要用大数。。

#include <stdio.h>#include <string.h>#define max(a,b) (a)>(b)?(a):(b)struct BigInt{    const static int mod = 10000;    const static int DLEN = 4;    int a[100],len;    BigInt()    {        memset(a,0,sizeof(a));        len = 1;    }    void set(int v)    {        memset(a,0,sizeof(a));        len = 0;        do        {            a[len++] = v%mod;            v /= mod;        }        while(v);    }    BigInt operator +(const BigInt &b)const    {        BigInt res;        res.len = max(len,b.len);        for(int i = 0; i <= res.len; i++)            res.a[i] = 0;        for(int i = 0; i < res.len; i++)        {            res.a[i] += ((i < len)?a[i]:0)+((i < b.len)?b.a[i]:0);            res.a[i+1] += res.a[i]/mod;            res.a[i] %= mod;        }        if(res.a[res.len] > 0)res.len++;        return res;    }    void output()    {        printf("%d",a[len-1]);        for(int i = len-2; i >=0 ; i--)            printf("%04d",a[i]);        printf("\n");    }};const int MAXN = 1010;BigInt dp[MAXN];int w[110];int N,K;int main(){    scanf("%d %d",&N,&K);    for(int i = 0; i < K; ++i)        w[i] = i+1;    dp[0].set(1);    for(int i = 0; i < K; ++i)    {        for(int j = w[i]; j <= N; ++j)        {            dp[j] = dp[j] + dp[j-w[i]];        }    }    dp[N].output();    return 0;}
原创粉丝点击