可以用dp做,但我只利用了重叠子问题这个特点,代码相对复杂,也慢一点。
。。感觉算法导论上dp讲的非常好,看一遍就懂了,刘汝佳的书我之前看了几天都没懂。。。也可能我现在已经有基础了吧
#include<cstdio>
#include<cstring>
#define MAX 8000
using namespace std;
int map[MAX];
int main()
{
int n,a,b,c,all,temp1,temp2,temp3,help;
memset(map,-1,MAX*4);
while(scanf("%d",&n)!=EOF)
{
all=0;
for(a=0;a<=n;a++)
{
temp1=a*50;
if(temp1>=n)
{
if(temp1==n&&temp1!=0)
all++;
break;
}
for(b=0;b<=n;b++)
{
temp2=temp1+b*25;
if(temp2>=n)
{
if(temp2==n&temp2!=0)
all++;
break;
}
if(map[n-temp2]!=-1)
{
all+=map[n-temp2];
}
else
{
help=0;
for(c=0;c<=n;c++)
{
temp3=temp2+c*10;
if(temp3>=n)
{
if(temp3==n)
help++;//写错一次
break;
}
help+=(n-temp3)/5+1;
}
all+=help;
map[n-temp2]=help;
}
}
}
printf("%d\n",all);
}
return 0;
}