andre_joy

导航

poj 3181

地址:http://poj.org/problem?id=3181

题意:类似分硬币,给n,m,钱是n,有m中硬币,分别是1~m,求多少种分法

mark:普通的完全背包不行,会超long long,需要一点高精度的技巧,会大数加法就没问题了。

代码:

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <map>
#define LL long long

using namespace std;

const int N = 1010;
int dp[N][40];

void add(int n, int m)
{
    int i,j,k;
    for(i = 0; i < 40; i++)
    {
        dp[n][i] += dp[m][i];
        if(dp[n][i] >= 10)
            dp[n][i] -= 10, dp[n][i+1]++;
    }
}

int main()
{
    int n,m;
    int i,j;
    while(~scanf("%d%d", &n, &m))
    {
        memset(dp, 0, sizeof(dp));
        dp[0][0] = 1;
        for(i = 1; i <= m; i++)
            for(j = i; j <= n; j++)
                add(j, j-i);
        for(i = 40; i >= 0 && !dp[n][i]; i--);
        for(; i >= 0; i--)
            printf("%d", dp[n][i]);
        printf("\n");
    }
    return 0;
}

posted on 2012-09-21 20:14  andre_joy  阅读(156)  评论(0编辑  收藏  举报