HDU——1085 Holding Bin-Laden Captive!(母函数)

2023-12-28 14:32

本文主要是介绍HDU——1085 Holding Bin-Laden Captive!(母函数),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Problem Description

We all know that Bin-Laden is a notorious terrorist, and he has disappeared for a long time. But recently, it is reported that he hides in Hang Zhou of China!
“Oh, God! How terrible! ”

Don’t be so afraid, guys. Although he hides in a cave of Hang Zhou, he dares not to go out. Laden is so bored recent years that he fling himself into some math problems, and he said that if anyone can solve his problem, he will give himself up!
Ha-ha! Obviously, Laden is too proud of his intelligence! But, what is his problem?
“Given some Chinese Coins (硬币) (three kinds– 1, 2, 5), and their number is num_1, num_2 and num_5 respectively, please output the minimum value that you cannot pay with given coins.”
You, super ACMer, should solve the problem easily, and don’t forget to take $25000000 from Bush!

Input

Input contains multiple test cases. Each test case contains 3 positive integers num_1, num_2 and num_5 (0<=num_i<=1000). A test case containing 0 0 0 terminates the input and this test case is not to be processed.

Output

Output the minimum positive value that one cannot pay with given coins, one line for one case.

Sample Input

1 1 3
0 0 0

Sample Output

4

解题思路:

利用母函数的普通母函数解决问题。
母函数讲解链接:https://blog.csdn.net/vsooda/article/details/7975485

代码:

注:G++ AC ,C++ WA

#include <stdio.h>
#include <string.h>
using namespace std;int ways[8001];  //记录 获取当前价值(下标值) 可以有几种组合方法
int temp[8001];  //ways 的 中间值。
int coin[4] = {0 , 1 , 2 ,5};
int numcoin[4];
int main(){int curmax = 0 , i ,j ,k;  //当前拥有的所有硬币可以得到的最大价值while(scanf("%d %d %d",&numcoin[1] , &numcoin[2] , &numcoin[3]) == 3){if(numcoin[1] == 0 && numcoin[2] == 0 && numcoin[3] == 0)break;curmax = 0;memset(ways , 0 , sizeof(ways));memset(temp , 0 , sizeof(temp));curmax = coin[1] * numcoin[1]; //只有第一种硬币时可以获得的最大价值for(i = 0 ; i <= curmax ; i ++)ways[i] = 1;    //因为 第一种硬币的价值是 1 ,所以直至他能所表示的最大价值 ,每种价值都可以表示出来 ,且都只有一种表示方式。for(i = 2 ; i <= 3 ; i++){curmax = curmax + coin[i] * numcoin[i] ;  //加入第i中硬币,能获得的总价值也随之变大。for( k = 0 ; k <= curmax - coin[i] * numcoin[i]; k ++){for(j = 0 ; j <= curmax ; j = j + coin[i]){temp[k + j] = temp[j + k] + ways[k] ;//加上第 i 中硬币 , 获得价值(k + j)的方法数 = 获得价值 j 的方法数 * 获得价值 k 的方法数。//其中价值 j 由第 i 中硬币组成(只有一种方法)//价值 k 的组成方法为 ways[k]}}for(k = 0 ; k <= curmax ; k++)ways[k] = temp[k];memset(temp , 0 , sizeof(temp));}for(i = 0 ; i <= curmax ; i++)if(ways[i] == 0){ //表示有 0 中组合方法可以获得价值 i。即无法获得价值 i.printf("%d\n",i);break;}if(i == curmax  + 1) //最大价值以内的值都能够表示,则结果输出为 最大价值+1printf("%d\n",i);}return 0;
}

这篇关于HDU——1085 Holding Bin-Laden Captive!(母函数)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/546271

相关文章

hdu1171(母函数或多重背包)

题意:把物品分成两份,使得价值最接近 可以用背包,或者是母函数来解,母函数(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v) 其中指数为价值,每一项的数目为(该物品数+1)个 代码如下: #include<iostream>#include<algorithm>

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO

hdu 2093 考试排名(sscanf)

模拟题。 直接从教程里拉解析。 因为表格里的数据格式不统一。有时候有"()",有时候又没有。而它也不会给我们提示。 这种情况下,就只能它它们统一看作字符串来处理了。现在就请出我们的主角sscanf()! sscanf 语法: #include int sscanf( const char *buffer, const char *format, ... ); 函数sscanf()和

hdu 2602 and poj 3624(01背包)

01背包的模板题。 hdu2602代码: #include<stdio.h>#include<string.h>const int MaxN = 1001;int max(int a, int b){return a > b ? a : b;}int w[MaxN];int v[MaxN];int dp[MaxN];int main(){int T;int N, V;s

hdu 1754 I Hate It(线段树,单点更新,区间最值)

题意是求一个线段中的最大数。 线段树的模板题,试用了一下交大的模板。效率有点略低。 代码: #include <stdio.h>#include <string.h>#define TREE_SIZE (1 << (20))//const int TREE_SIZE = 200000 + 10;int max(int a, int b){return a > b ? a :

hdu 1166 敌兵布阵(树状数组 or 线段树)

题意是求一个线段的和,在线段上可以进行加减的修改。 树状数组的模板题。 代码: #include <stdio.h>#include <string.h>const int maxn = 50000 + 1;int c[maxn];int n;int lowbit(int x){return x & -x;}void add(int x, int num){while

hdu 3790 (单源最短路dijkstra)

题意: 每条边都有长度d 和花费p,给你起点s 终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的。 解析: 考察对dijkstra的理解。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstrin

hdu 2489 (dfs枚举 + prim)

题意: 对于一棵顶点和边都有权值的树,使用下面的等式来计算Ratio 给定一个n 个顶点的完全图及它所有顶点和边的权值,找到一个该图含有m 个顶点的子图,并且让这个子图的Ratio 值在所有m 个顶点的树中最小。 解析: 因为数据量不大,先用dfs枚举搭配出m个子节点,算出点和,然后套个prim算出边和,每次比较大小即可。 dfs没有写好,A的老泪纵横。 错在把index在d

hdu 1102 uva 10397(最小生成树prim)

hdu 1102: 题意: 给一个邻接矩阵,给一些村庄间已经修的路,问最小生成树。 解析: 把已经修的路的权值改为0,套个prim()。 注意prim 最外层循坏为n-1。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstri