dp问题,d(i,j)表示用前i(从0开始计算)中硬币构成面值j的总数。
则 的d(i , j) = d(i , j - w[i]) + d(i-1 , j); 即用前i中硬币构成面值j的种类数等于用前(i-1)中硬币构成面值j的种类数(其实就是不用第i中硬币)
加上用第i中硬币至少一次构成j的种类数(也就是等于用第i中硬币至少0次构成面值(j-w[i])的种类数)。
实际中可以使用滚动数组,将d(i,j)降到一维。
#include <cstdio>
#include <cstdlib>
using namespace std;
const int size = 8000;
int c[] = {1 , 5 , 10 , 25 , 50};
int d[size+1];
int main()
{
int n;
for(int i = 0 ; i <= size ; ++i)
d[i] = i / 5 + 1;
for(int i = 2 ; i < 5 ; ++i)
{
for(int j = 0 ; j < size ; ++j)
{
if(j >= c[i]) d[j] += d[j-c[i]];
}
}
while(scanf("%d" , &n) == 1)
{
printf("%d\n" , d[n]);
}
return 0;
}