HDU 1085 Holding Bin-Laden Captive!

http://acm.hdu.edu.cn/showproblem.php?pid=1085

这题是母函数的运用,解题关键在于硬币的数量即不是1,也不是无限,所以要一种面值,一种面值的往上叠加

#include<stdio.h>
int c1[10001],c2[10001];
int main()
{
    int max,num1,num2,num5,i,j,k;
    while(scanf("%d%d%d",&num1,&num2,&num5),num1||num2||num5)
    {
        max=num1*1+num2*2+num5*5;
        for(i=0;i<=max;i++)
            c1[i]=c2[i]=0;
        for(i=0;i<=num1;i++)
            c1[i]=1;
            //这里是所有1能组成的
        for(i=0;i<=num1;i++)
            for(j=0;j<=num2*2;j+=2)
            c2[i+j]+=c1[i];//这里是在1组完了的基础上在加上硬币值为2的方案数
        for(i=0;i<=num1+num2*2;i++)
        {
            c1[i]=c2[i];
            c2[i]=0;
        }
        
        for(i=0;i<=num1+num2*2;i++)
            for(j=0;j<=num5*5;j+=5)
            c2[i+j]+=c1[i];
        for(i=0;i<=num1+num2*2+num5*5;i++)
        {
            c1[i]=c2[i];
            c2[i]=0;
        }//同上,这里是处理面值5的情况,本题注意范围的变化,其实就是一种一种的往上加而已
        
        for(i=0;i<=max;i++)
            if(!c1[i])
        {
            printf("%d\n",i);
            break;
        }
        if(i>max)
            printf("%d\n",i);
    }
    return 0;
}
View Code

 

posted @ 2013-09-07 23:03  执着追求的IT小小鸟  阅读(140)  评论(0编辑  收藏  举报