题意:用5种面值的硬币组成S有几种方法。
——>>设d[i][j]为用前i种硬币组成j有几种方法,则
当j >= 第i种面值的硬币时,d[i][j] = d[i-1][j-c[i]] + d[i-1][j];
否则,只有一种选择,d[i][j] = d[i-1][j];
第一次没打表,就TLE了……打表AC!
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 7489 + 10;
int d[6][maxn], c[] = {0, 50, 25, 10, 5, 1};
int main()
{
int S, i, j;
memset(d, 0, sizeof(d));
d[0][0] = 1;
for(i = 1; i <= 5; i++)
for(j = 0; j < maxn; j++)
if(j >= c[i]) d[i][j] = d[i][j-c[i]] + d[i-1][j];
else d[i][j] = d[i-1][j];
while(~scanf("%d", &S)) printf("%d\n", d[5][S]);
return 0;
}
本文介绍了一个经典的动态规划问题——使用不同面值的硬币组成特定金额的方法数。通过递推公式实现了高效的算法,并给出了完整的C++代码实现。
161

被折叠的 条评论
为什么被折叠?



