HDU_1085_Holding Bin-Laden Captive!

来源:互联网 发布:小学生口语打分软件 编辑:程序博客网 时间:2024/04/23 22:56

      母函数


      题意,给定1、2、5三种硬币,输入各种硬币的数量,问最小不能表示多大的钱数。
      此题分析:构造G(x)=(1+x+x^2+x^3+x^4+…)(1+x^2+x^4+x^6+…)(1+x^5+x^10+x^15+…)这样一个母函数,所求即为x^n的系数最开始为0的那项。(其中x表示面值,1表示不选,次方数表示面值的权值)。


#include<iostream>
#include<string.h>

using namespace std;

const int MAX=10000;

int sum[MAX];
int v[MAX];

int main(){
    int i, j, k, max;
    int a[3];
    int c[3] = { 1, 2, 5 };
    while( cin>>a[0]>>a[1]>>a[2] && (a[0]+a[1]+a[2])){
        max = a[0]+a[1]*2+a[2]*5;
        for(i=0; i<=max; i++){
            sum[i] = v[i] = 0;
        }
        for(i=0; i<=a[0]; i++){
            sum[i] = 1;
        }
        for(i=1; i<=2; i++){
            for(j=0; j<=max; j++){
                for(k=0; k<=a[i]*c[i] && k+j<=max; k+=c[i]){
                    v[k+j] += sum[j];
                }
            }
            for(j=0; j<=max; j++){
                sum[j] = v[j];
                v[j] = 0;
            }
        }
        for( i = 1; i <= max; i++ ){
            if( sum[i] == 0 )
                break;
        }
        cout<<i<<endl;    
    }
    return 0;
}


原创粉丝点击