HDU1085 Holding Bin-Laden Captive!(母函数)

Holding Bin-Laden Captive!

题目链接:

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

解题思路:

一道母函数的题目,至于有关母函数详细的讲解,请看这个人的博客:http://www.wutianqi.com/?p=596

至于我对母函数的理解吧,个人认为其实还是很简单的,代码里有备注。

AC代码:

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

int main(){
    int a[] = {1,2,5},num[3];
    while(scanf("%d%d%d",&num[0],&num[1],&num[2]),num[0]+num[1]+num[2]){
        int k,sum = 0;
        int c1[10000],c2[10000],cnt[10000];
        for(int i = 0; i < 3; i++)
            sum += a[i]*num[i];
        memset(c1,0,sizeof(c1));        //初始化
        memset(c2,0,sizeof(c2));        //初始化
        for(int i = 0; i <= num[0]; i++)
            c1[i] = 1;                    //a[0]这枚硬币有多少个,就对c1前多少个进行初始化
        for(int i = 1; i < 3; i++){
            for(int j = 0; j <= sum; j++)
                for(k = 0; k+j<=sum && k<=a[i]*num[i]; k += a[i])       //k值以a[i]的数量进行递增
                    c2[k+j] += c1[j];     //进行叠加
            for(int j = 0; j <= sum; j++){
                c1[j] = c2[j];
                c2[j] = 0;                //赋值转换
            }
        }
        for(int i = 1; i <= sum+1; i++)
            if(c1[i] == 0){
                printf("%d\n",i);
                break;
            }
    }
    return 0;
}


你可能感兴趣的:(母函数)