hdu 2069 Coin Change

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;
}
posted @ 2011-08-04 10:05  ○o尐懶錨o  阅读(186)  评论(0编辑  收藏  举报