SPOJ 25000 BOKAM143SOU

来源:互联网 发布:js怎么调用类库 编辑:程序博客网 时间:2024/05/30 04:24

Description
给出一个正整数n,问把n拆成至多五个立方数的和的方案数
Input
一个整数n(1<=n<=125000)
Output
输出把n拆成至多五个立方数的和的方案数
Sample Input
64
Sample Output
2
Solution
dp[i][j]表示把i拆成j个立方数的方案数,则有转移方程dp[i+k*k*k*][j]+=dp[i][j-1]
k至多50,dp[n][5]即为答案(因为把0也看作立方数所以dp[n][5]其实就是把n拆成至多5个立方数的方案数)
Code

#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>#include<cmath>#include<vector>#include<queue>#include<map>#include<set>#include<ctime>using namespace std;typedef long long ll;#define INF 0x3f3f3f3f#define maxn 125125int n,dp[maxn][6];int main(){    while(~scanf("%d",&n))    {        memset(dp,0,sizeof(dp));        dp[0][0]=1;        for(int i=0;i<=50;i++)            for(int j=0;j+i*i*i<=n;j++)                for(int k=0;k<5;k++)                    dp[j+i*i*i][k+1]+=dp[j][k];        printf("%d\n",dp[n][5]);    }    return 0;}
原创粉丝点击