http://acm.hdu.edu.cn/showproblem.php?pid=2069
这道题一看就是母函数,于是就觉得它很简单,出现了错误的代码:
#include<stdio.h>
int main()
{
int n;
int i,j,k;
int a[1000],b[1000],num[6]={0,1,5,10,25,50};
while(scanf("%d",&n)!=EOF)
{
for(i=0;i<=n;i++)
{
a[i]=1;
b[i]=0;
}
for(i=2;i<=5;i++)
{
for(j=0;j<=n;j++)
for(k=0;k+j<=n;k+=num[i])
b[j+k]+=a[j];
for(j=0;j<=n;j++)
{
a[j]=b[j];
b[j]=0;
}
}
printf("%ld\n",a[n]);
}
return 0;
}
错误的原因是没有考虑到Your program should be able to handle up to 100 coins.百度了一下,才现在自己这里没有判断,于是就有两种方法,一是暴力(模仿百钱买百鸡),二是母函数的变形
暴力代码:(828MS)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
int a,b,c,d,e,count,n;
while(scanf("%d",&n)!=EOF)
{
count=0;
for(a=0;a<=100;a++)
for(b=0;b*5<=n;b++)
for(c=0;c*10<=n;++c)
for(d=0;d*25<=n;++d)
for(e=0;e*50<=n;++e)
if(a+b*5+c*10+25*d+50*e==n&&a+b+c+d+e<=100)
count++;
printf("%d\n",count);
}
system("pause");
return 0;
}
母函数变形代码:(一不小心用c++提交 wa好多次,不过改g++就ac了)
#include <stdio.h>
#include <stdlib.h>
int c1[260][101],c2[260][101];//第二维数组为硬币数
int main()
{
int n,a[5]={1,5,10,25,50},sum;
for(int i=0;i<=260;++i)
for(int j=0;j<=101;++j)
{
c1[i][j]=0;c2[i][j]=0;
}
for(int i=0;i<=100;++i)//用面值为1的硬币组成价值为i(不超过100)
{
c1[i][i]=1;
}
for(int i=1;i<=5;++i)
{
for(int j=0;j<=260;++j)
{
for(int k=0;j+k<=260;k+=a[i])
{
for(int l=0;l+k/a[i]<=100;l++)//k/a[i]新增的硬币数
c2[k+j][l+k/a[i]]+=c1[j][l];
}
}
for(int j=0;j<=250;++j)
for(int l=0;l<=100;++l)
{
c1[j][l]=c2[j][l];
c2[j][l]=0;
}
}
while(scanf("%d",&n)!=EOF)
{
sum=0;
for(int i=0;i<=100;++i)
sum+=c1[n][i];
printf("%d\n",sum);
}
//system("pause");
return 0;
}