状态转移方程 dp[ j ][ k ] = dp[ j-1 ][ k-money[i] ] + dp[ j ] [ k ];
注意 dp[0][0]处赋值为1.
#include<stdio.h>
#include<string.h>
int dp[101][300];
int money[6]={0,1,5,10,25,50};
int n;
void work()
{
int i,k,j;
memset(dp,0,sizeof(dp));
dp[0][0]=1;
for(i=1;i<=5;i++)
{
for(j=1;j<=100;j++)
{
for(k=money[i];k<=250;k++)
dp[j][k] += dp[j-1][k-money[i]];
}
}
}
int main()
{
int sum,i;
work();
while(scanf("%d",&n)&&n)
{
sum = 0;
for(i=0;i<=100;i++)
{
sum += dp[i][n];
}
printf("%d\n",sum);
}
return 0;
}