这个题关键是如何限制钱的张数不超过100,如果没有限制,直接母函数模板往上套,哈哈,这个题开二维数组来存数据,第一个中括号存总价值,第二个中括号存钱的张数,然后四重循环我就不一一解释了,仔细看看应该能懂。
我们知道人民币有1、2、5、10、20、50、100这几种面值。 现在给你 n(1≤n≤250)元,让你计算换成用上面这些面额表示且总数不超过100张,共有几种。 比如4元,能用4张1元、2张1元和1张2元、2张 2元,三种表示方法。
Input
输入有多组,每组一行,为一个整合n。 输入以0结束。
Output
输出该面额有几种表示方法。
Sample Input
1 4 0
Sample Output
1 3
代码
#include <iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<algorithm>
using namespace std;
int a[251][251],b[251][251],ans[251],v[]={1,2,5,10,20,50,100};
int main()
{
int i,j,k,l,m,n;
a[0][0]=1;
for(i=0;i<7;i++)
{
for(j=0;j*v[i]<251;j++)
{
for(k=0;k+j*v[i]<251;k++)
for(l=0;l+j<=100;l++)
b[j*v[i]+k][l+j]+=a[k][l];
}
for(j=0;j<251;j++)
{
for(k=0;k<251;k++)
{
a[j][k]=b[j][k];
b[j][k]=0;
}
}
}
for(i=0;i<251;i++)
{
for(j=0;j<=100;j++)
ans[i]+=a[i][j];
}
while(scanf("%d",&n)!=EOF&&n!=0)
{
printf("%d\n",ans[n]);
}
return 0;
}