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

来源:互联网 发布:卧室家具摆放设计软件 编辑:程序博客网 时间:2024/05/20 18:54

Holding Bin-Laden Captive!

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 22097    Accepted Submission(s): 9814


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 30 0 0
 

Sample Output
4
 

Author
lcy
 


思路:首先这道题目让求得是给定数量的1,2,5不能表示的最小正整数,首先要注意一点,当这三种钱币能够表示的最大值以及以内的数都能够表示的时候,则不能表示的最小正整数就是sum+1.





#include <cstdio>#include <cstring>using namespace std;int c1[10005],c2[10005],a[3]={1,2,5},num[3];int main(){while(~scanf("%d%d%d",&num[0],&num[1],&num[2])){if(!num[0] && !num[1] && !num[2])break;memset(c1,0,sizeof(c1));memset(c2,0,sizeof(c2));for(int i = 0; i <= num[0]; i ++){//对第一个表达式进行初始化 c1[i] = 1;}int sum = 0;for(int i = 0; i < 3; i ++){//求出能够表示的最大值 sum += num[i] * a[i];}for(int i = 1; i < 3; i ++){//剩下的表达式 for(int j = 0; j <= sum; j ++){//表示原先从c1项中存在的幂指数为j的元素 if(c1[j]){//幂指数为j的元素存在则可以相乘 for(int k = 0; k <= num[i]*a[i]; k += a[i]){//表示当前表达式中个元素的幂指数 if(k+j <= sum)//判断相乘后的幂指数是否超过能够表达的最大值 c2[k+j] += c1[j];}}}for(int j = 0; j <= sum; j ++){c1[j] = c2[j];c2[j] = 0;}  }int i;          for (i = 0; i <= sum; i++) {              if (c1[i] == 0)                  break;          }  //如果sum以内的值都能够表示出来,则不能够表示的最小数是sum+1;         printf("%d\n", i); }return 0;}


0 0
原创粉丝点击