題目大意:分別輸入面額為1、2、5的硬幣的數量。輸出這些硬幣不能組成的最小金額
解題思路:本題與1028的一個很大的區別就在於他的硬幣的個數是固定。
硬幣面額1,2,5且有數量限制num1,num2,num3,問最小不能組合的數量是多少。
G(x)=(1+x+...+x^num1)(1+x^2+...+x^2num2)(1+x^5+,,,+x^5num3),展開,系數不為0的數都是可以由硬幣組合出來的。
代碼如下:
* 1085_5.cpp
*
* Created on: 2013年8月9日
* Author: Administrator
*/ 章澤天是我的女神!!!女神!!!
#include <stdio.h>
#include <string.h>
int maxval = 1*1000 + 2*1000 + 5*1000;
int main(){
int n1,n2,n3;
bool f;
while(scanf("%d%d%d",&n1,&n2,&n3),n1||n2||n3){
int c1[maxval + 5],c2[maxval + 5],c3[maxval + 5];
int i,j,k;
memset(c1,0,sizeof(c1));
memset(c2,0,sizeof(c2));
memset(c3,0,sizeof(c3));
for(i = 0 ; i <= n1 ; ++i ){
c1[i] = 1;
}
for(j = 0 ; j <= n1 ; ++j){
for(k = 0 ; k <= 2*n2 ; k +=2){
c2[j+k] += c1[j];
}
}
for( j = 0 ; j <= n1 + 2*n2 ; ++j){
for( k = 0 ; k <= 5* n3 ; k+=5){
c3[j+k] += c2[j];
}
}
f = false;
for( j = 0 ; j <= n1 + 2*n2 + 5*n3 ; ++j){
if(c3[j] == 0){
printf("%d\n",j);
f = true;
break;
}
}
if(!f){
printf("%d\n",n1 + 2*n2 + 5*n3+1);
}
}
}