HDOJ-1085-Holding Bin-Laden Captive! 解题报告

       普通母函数水题。题意:有三种面值的硬币,一元,两元和五元,个数分别为num_1,num_2,num_5,现在求不能一次性付清的最少钱数。比如如果你只有一个两元硬币,那么1元就是你无法一次付清的最少钱数。


       我的解题思路:以钱数来做x的指数,那么这道题其实就是求指数最小的系数为0项(指数为0不算)了。


       我的解题代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <math.h>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <map>

using namespace std;

const int N = 10000;

int coe[N], tmp[N];
int num[3], val[3] = {1, 2, 5};

void Generate();

int main()
{
    while (~scanf("%d %d %d", &num[0], &num[1], &num[2]))
    {
        if (num[0] == num[1] && num[1] == num[2] && num[0] == 0) break;
        Generate();
        for (int i=1; i<N; ++i)
        {
            if (coe[i] == 0)
            {
                printf("%d\n", i);
                break;
            }
        }
    }
    return 0;
}

void Generate()
{
    memset(coe, 0, sizeof(coe));
    memset(tmp, 0, sizeof(tmp));
    coe[0] = 1;
    for (int i=0; i<3; ++i)
    {
        for (int j=0; j<N; ++j)
        {
            if (coe[j] == 0) continue;
            for (int k=0; k<=num[i]; ++k)
            {
                tmp[k * val[i] + j] += coe[j];
            }
        }
        memcpy(coe, tmp, sizeof(coe));
        memset(tmp, 0, sizeof(tmp));
    }
    return;
}


猜你喜欢

转载自blog.csdn.net/JZQT_T/article/details/45748937
今日推荐