zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    SpringBoot第五篇:整合Mybatis
    SpringBoot第四篇:整合JDBCTemplate
    SpringBoot第三篇:配置文件详解二
    分享一篇去年的项目总结
    Oracle生成多表触发器sql
    Oracle 设置用户密码永不过期
    Oracle建表提示SQL 错误: ORA-00904: : 标识符无效
    MySql数据备份
    ETL全量多表同步简述
    ETL全量单表同步简述
  • 原文地址:https://www.cnblogs.com/yuelingzhi/p/2126978.html
Copyright © 2011-2022 走看看