这是一道dp问题,题型为钱币兑换。与普通的钱币兑换不同的是,这题对于钱币的数量有要求,不能超过100,这就需要多开一维数组表示钱币的数量,相应的,循环也应多跑一层来计算钱币的数量。注意这里的第二层循环与普通的钱币兑换不同,是倒着跑的,这是因为在第四层循环时要求得正确结果必须保证之前的数据未被修改,否则得到的结果不正确(会非常的大),因此要倒着跑。
#include <stdio.h>
int money[8]={0,1,2,5,10,20,50,100};
int dp[255][105];
int main()
{
int i,j,k,x,y,n;
for(i=1;i<=7;i++)
{
for(j=250;j>=money[i];j--)
{
for(k=1;k<=100;k++)
{
if(k*money[i]==j)
dp[j][k]++;
x=j,y=k;
for(x-=money[i],y--;x>0&&y>0;x-=money[i],y--)
dp[j][k]+=dp[x][y];
}
}
}
for(i=1;i<=250;i++)
for(j=1;j<=100;j++)
dp[i][0]+=dp[i][j];
while(scanf("%d",&n)!=EOF)
{
if(n==0)
break;
printf("%d\n",dp[n][0]);
}
return 0;
}