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
题目中说的问题是有1 2 5三中硬币及其数量,问你用这些硬币不能组成的最小数字是多少。一开始没有思路,后来看了其他人的博客说用母函数,
大概看了一下母函数的,本人也是初学母函数,这题算是母函数入门题,比较简单,模拟多项式乘积就行,由于本人也是初学母函数,我在这就不介绍母函数了,
网上好多资料,我觉得杭电的ppt比较好。
三种硬币要组合起来可以看成是多项式相乘,比如一个价值为1的硬币和一个价值为2的硬币组合可以看成是(1+x)*(1+x^2)=1+x+x^2+x^3;
每一项的指数代表组合后的价值,系数表示组成该价值的方法数。关键在于如何模拟多项式相乘。
 1 #include <iostream>
 2 #include <cstring>
 3 using namespace std;
 4 
 5 int main()
 6 {
 7     int n,m,k,a1[11000],a2[11000],a3[11000],ma;
 8     while (cin>>n>>m>>k)
 9     {
10           if (n==0&&m==0&&k==0)
11           break;
12           memset(a1,0,sizeof(a1));
13           memset(a2,0,sizeof(a1));
14           memset(a3,0,sizeof(a1));
15           for (int i=0;i<=n;i++)
16           a1[i]=1;
17           
18           for (int j=0;j<=n;j++)
19           for (int i=0;i<=2*m;i+=2)
20           a2[j+i]+=a1[j];
21           
22           for (int i=0;i<=n+2*m;i++)
23           for (int j=0;j<=k*5;j+=5)
24           a3[i+j]+=a2[i];
25           
26           int t=0;
27           for (int i=0;i<=1100;i++)
28           {
29               if (a3[i]==0)
30               {
31                            t=1;
32                            cout <<i<<endl;
33                            break;
34               }
35           }
36           if (t==0)
37           {
38                    cout <<n+2*m+5*k+1<<endl;//这个地方要注意,所有的都有那就是n+2*m+5*k+1最小。
39           }
40     }
41     return 0;
42 }
View Code
posted @ 2015-02-07 00:46  ~Arno  阅读(234)  评论(0编辑  收藏  举报