题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1085
题目大意:硬币问题
解题思路:给出了硬币的种类,每种硬币的个数,最大能组合出的数可以计算出来
代码如下:
#include <stdio.h>
#include <string.h>
const int MAX=12000;
int c1[MAX],c2[MAX];
int main()
{
int n[4],m[4]={1,2,5};
while(scanf("%d%d%d",&n[0],&n[1],&n[2])&&(n[0]+n[1]+n[2]))
{
c1[0]=1;
int max=0,max1;//max为当前c1数组里最大的指数,即最大能组合出的数
for(int i=0; i<3; i++)//循环每个因子
{
max1=max+n[i]*m[i];//每次循环的界限控制的恰到好处
for(int j=0; j<=n[i]; j++)//每个因子的每一项,共有n[i]+1项
{
for(int k=0; k<=max; k++)//循环c1数组的每一项
c2[k+j*m[i]] += c1[k];
}
max=max1;
memcpy(c1,c2,sizeof(c2));
memset(c2,0,sizeof(c2));
/*for(int p=0;p<=max1;p++)//真心不明白为什么换成下面的赋值和初始化就不对,而且如果把max1换成MAX就可以通过,难道超过max1了,但是这不应该啊
c1[p]=c2[p],c2[p]=0;*/
}
for(int i=0;;i++)
if(!c1[i])
{
printf("%d\n",i);
break;
}
}
return 0;
}