题目大意:给出5中硬币,分别是1,5,10,25,50,然后给你一个数字,能由这五种硬币组成的方式有多少种

解题思路:解法一:硬币按小到大排,用j表示还有能用几种硬币表示,则当j==0时,则表示所剩下的值可以用n个1来表示,具体看代码

#include<cstdio>
const int maxn = 7500;
int coin[5] = {1,5,10,25,50};
int s[maxn][5],n;

int dp(int i, int j) {

	if(j == 0)
		return s[i][j] = 1;

	if(s[i][j] > 0)	
		return s[i][j];

	for(int k = 0; k <= i; k += coin[j]) 
		s[i][j] = s[i][j] + dp(i-k,j-1);
	
	return s[i][j];	
}

int main() {
	while(scanf("%d", &n) != EOF)  {
		printf("%d\n", dp(n,4));
	}
	return 0;	
}



解法二:滚动数组的打表法,用dp[i]表示i能有几种表示方式,则dp[i] = dp[i] + dp[i-coin[j]],第二个dp[i]表示的是再第j种硬币之前的i能有几种表示方式

#include<cstdio>
#include<cstring>

int dp[7500] = {0};
int coin[5] = {50,25,10,5,1};

int main() {
	dp[0] = 1;
	for(int i = 0 ; i < 5; i++)
		for(int j = coin[i]; j < 7500; j++)
			dp[j] += dp[j-coin[i]];
	int num;
	while(scanf("%d",&num) != EOF)
		printf("%d\n",dp[num]);
}