#include<iostream>//母函数
#include<stdio.h>
#define max 300//题目说不超过300
using namespace std;
int a1[max+1],a2[max+1];//防止溢出
int main()
{
int i,j,n,k;
while(scanf("%d",&n)!=EOF,n)
{
for(i=0;i<=n;i++)
{ a1[i]=1;a2[i]=0; }//假设都是一种,先进行初始化
for(i=2;i<=17;i++)//从2到n,题目中提到为17种硬币,
{
for(j=0;j<=n;j++)//j为从0到n,表示前i项试的第j个变量
for(k=0;k+j<=n;k+=i*i)//因为是硬币全为i的平方,所以累乘时第j个变量的指数增加i的平方
{ a2[j+k]+=a1[j]; }
for(j=0;j<=n;j++)
{ a1[j]=a2[j];a2[j]=0; } //a2中间变量,进行清0
}
printf("%d\n",a1[n]);
}
return 0;
}
hdu 1398
最新推荐文章于 2018-08-19 20:31:05 发布