题意是给你一定数目的1,2,5分的硬币,
告诉你各自的数量 ,让你找出不能被这些硬币表示的最小价值。
万变不离其中。
题目给出了3种类型,每种既不是1个,又不是无限个。怎么办?
给定硬币的值,输入数量
hdu 1085 Holding Bin-Laden Captive!
Output
Output the minimum positive value that one cannot pay
with given coins, one line for one case.
Sample Input
Sample Output
4
当c1[n],就是xn前的系数,如果c1[n]==0,即是果项不存在,则没有可行的方案
一开始最后的循环,忘记左判断一种情况,所以没有输出又直接循环到while
一直提示输入。。。
- #include<stdio.h>
- int c1[10000],c2[10000];
- int main()
- {
- int num_1,num_2,num_5;
- while(scanf("%d%d%d",&num_1,&num_2,&num_5) && (num_1||num_2||num_5))
- {
-
- int i,j,k;
- int _max=num_1+num_2*2+num_5*5;//可能出现的最大指数
- for(i=0;i<=_max;i++)//最个数组初始化先
- {
- c1[i]=0;
- c2[i]=0;
- }
- //第一个括号
- for(i=0;i<=num_1;i++)//
- {
- c1[i]=1;
-
- }
- //第二个括号
- for(j=0;j<=num_1;j++)
- {
- for(k=0;k<=num_2*2;k+=2)//k的变化,最大值:num_2*2要根据每一个括号的数列来表示
- { //这里K可以超出,因为最大值为_max要根据每一个括号的数列来表示
- c2[k+j]+=c1[j];
- }
- }
-
- //保存一下
- for(j=0;j<=num_1+num_2*2;j++)//两个多项式相乘那个指数最大值num_1+num_2*2
- {
- c1[j]=c2[j];
- c2[j]=0;
- }
- //第三个括号
- for(j=0;j<=num_1+num_2*2;j++)
- {
- for(k=0;k<=num_5*5;k+=5)//k的变化,这里K可以超出要根据每一个括号的数列来表示
- {
- c2[k+j]+=c1[j];
- }
- }
- for(j=0;j<=_max;j++)
- {
- c1[j]=c2[j];
- c2[j]=0;
- }
-
- for(i=0;i<=_max;i++)
- {
- if(c1[i]==0)//第0项,不影响的,而且执行一次后不会为0
- {
- printf("%d\n",i);
- break;
- }
- }
- if(i==(_max+1))
- {
- printf("%d\n",i);
-
- }
- }
- return 0;
- }
阅读(901) | 评论(0) | 转发(0) |