HDU 1085 - Holding Bin-Laden Captive!

知识点:母函数

母函数类似背包,也有两种使用方法:

1、用 f1、f2 存储放法数;

2、用 f1、f2 存储状态。

例如本题中:f1[i]==1 表示 i 值可以达到,f1[i]==0 表示 i 无法达到。

#include <cstdio>  
  
int main()  
{  
    int num_1,num_2,num_5;  
    while(scanf("%d%d%d",&num_1,&num_2,&num_5),num_1||num_2||num_5)  
    {  
        int max=num_1+2*num_2+5*num_5;  
        bool f1[max+1],f2[max+1];  
        int i;  
         
  
        //用1分的硬币初始化f1、f2  
        for(i=0;i<=num_1;i++)  
        {  
            f1[i]=1;  
            f2[i]=0;  
        }  
        for(;i<=max;i++)  
        f1[i]=f2[i]=0;  
         
  
        //用2分的硬币更新f1、f2  
        for(i=0;i<=max;i++)  
        if(f1[i])  
        for(int j=0;j<=2*num_2;j+=2)  
        f2[i+j]=1;  
        for(i=0;i<=max;i++)  
        {  
            if(f2[i]) f1[i]=1;  
            f2[i]=0;  
        }  
         
  
        //用5分的硬币更新f1、f2  
        for(i=0;i<=max;i++)  
        if(f1[i])  
        for(int j=0;j<=5*num_5;j+=5)  
        f2[i+j]=1;  
        for(i=0;i<=max;i++)  
        {  
            if(f2[i]) f1[i]=1;  
            f2[i]=0;  
        }  
         
  
        for(i=0;i<=max&&f1[i];i++);  
        printf("%d\n",i);  
    }  
    return 0;  
}  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值