这是一道变形的母函数题,如果你真正的理解了母函数模板的由来,那么我觉得后面所有的母函数都是很轻松解决的。但是如果你不是很了解各个变量的意义和变化的缘由,那么后面的母函数的题就会一塌糊涂,甚至是看不明白为什么。在前几篇的文章中我已经很明晰的分析了各个变量,以及变化的缘由,这里不再赘述,只是吧相应的思想说一下,不过还是建议不会的同学看看我前面几篇文章关于母函数的详解(虽然有的是转载的),只有真正弄明白了,你才可以才母函数上有多提高。
题目的大意就是:你有1分,2分,5分的硬币分别是num1,numn2,num5,那么用这些硬币币可以随意拼凑钱要求你输出你不能拼凑的钱的最小值。那么其实就是求一个性质上的,可不可以?而不是数值上的有多少,这就相对简单了。
前面的处理就是母函数的模板类型,不需要多说。
主要是循环怎么控制,之前就说过了三个循环,第一个是i的循环表示你有多个多项式相乘,第二和j表示的是每一个多项式里面的第几项,第三个k就是多项式里面的幂的变化(当然在这里只有三个变量,没有必要弄k出来,只要i,j,就够了。)
#include<iostream> using namespace std; #include<string> const int Max=100003; int main() { int a[3]={1,2,5}; int num1,num2,num5; int b[Max],c[Max],s,i,j; while((cin>>num1>>num2>>num5)&&(num1||num2||num5)) { s=num1+num2*2+num5*5; for(i=0;i<=s;i++) { c[i]=0; b[i]=0; } for(i=0;i<=num1;i++) //这个主要就是你有num1个1分的,那么num的范伟内的都是可以拼凑出来的。当然了0也是可以的。 b[i]=1; for(i=0;i<=num1;i++) for(j=0;j<=num2*2;j+=2) //这里主要是之前的num1个1分的完了之后在加上num2个2分的j是指每一个多项式的个数,共有num2个,当然算上 c[i+j]=b[i]; //0就是num2加一个 for(i=0;i<=num1+num2*2;i++) { b[i]=c[i]; c[i]=0; } for(i=0;i<=num1+num2*2;i++)//这个是一样的道理。 for(j=0;j<=num5*5;j+=5) c[j+i]=b[i]; for(i=0;i<=s;i++) { b[i]=c[i]; c[i]=0; } for(i=0;i<=s;i++) if(b[i]==0) { cout<<i<<endl; break; } if(i==(s+1)) //最后这里讨论下,因为你的最大的表示金额是num1+num2*2+num5*5,
cout<<i<<endl; //有可能这个范围的所有的数都可以拼凑出来。} return 0;}