完全背包

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>

using std::cin;
using std::cout;
using std::endl;
int coin[]={1,8,27,64,125,216,343,512,729,1000,1331,1728,2197,2744,3375,4096,4913,5832,6859,8000,9261};
long long dp[10010][23];
int n;
long long dfs(int pre, int nx)
{
    if(nx==0)
        return 1;
    if(dp[nx][pre]!=-1)
        return dp[nx][pre];
    long long sum=0;
    for(int i=pre; i<21; i++)
    {
        if(nx>=coin[i])
            sum+=dfs(i,nx-coin[i]);
    }
    dp[nx][pre]=sum;
    return sum;
}
int main()
{
    memset(dp, -1, sizeof(dp));
    while(scanf("%d",&n)==1)
    {
        cout << dfs(0,n) << endl;
    }
    return 0;
}
View Code

 

posted on 2013-08-05 16:54  风流monkey  阅读(143)  评论(0)    收藏  举报