Dp[i][j] 表示前 i 种硬币构成面值 j 的方案数,
那么 Dp[i][j] = dp[ i - 1 ][ j ] + Dp[ i ][ j - a[ i ] ]
其中a[ i ]指第i种面值
然后用滚动数组
#include <cstdio>
#include <cstdlib>
using namespace std;
int a[] = {1, 2, 4, 10, 20, 40, 100, 200, 400, 1000, 2000};
long long dp[6001];
int main()
{
dp[0] = 1;
for (int i = 0; i < 11; i++)
for (int j = a[i]; j < 6001; j++)
dp[j] += dp[j - a[i]];
double t;
while (scanf("%lf", &t) == 1 && t != 0.00)
{
int n = (int)(t * 20 + 0.1f);
printf("%6.2f%17lld\n", t, dp[n]);
}
return 0;
}