hdu2069 Coin Change ——DP

May 24, 2013
Hdu DP

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2069 题目大意:   给一个数字,用1, 5, 10, 25,  50 这五种硬币,最多用100枚,有多少种组合方式。 题目思路:   这道题和之前的题目不同,有了硬币个数的限制,所以需要加上一维表示硬币的个数就可以了。d[i][j]表示价值为 i 的最多用 j 枚硬币有多少中组合方式。很多人用母函数做,感觉DP做简单多了…… 参考博客:http://www.cnblogs.com/qiufeihai/archive/2012/09/11/2680840.html


#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
const int MAX = 250+10;
int d[MAX][MAX], n, a[5] = {1, 5, 10, 25, 50};
void solve() {
  while (~scanf("%d", &n)) {
    int i, j, k;
    memset(d, 0, sizeof(d));
    d[0][0] = 1;
    for (k = 0; k < 5; ++k) {
      for (j = 1; j <= 100; ++j) {
        for (i = a[k]; i <= n; ++i) {
          d[i][j] += d[i-a[k]][j-1];
        }
      }
    }
    int sum(0);
    for (i = 0; i <= n; ++i) {
      sum += d[n][i];
    }
    printf("%d\n", sum);
  }
}
int main(void) {
  solve();
  return 0;
}

  还有要注意一点,初始化要d[0][0] = 1 因为题目中说:Note that we count that there is one way of making change for zero cent. 只能初始化这个值,不要把所有的d[0][i]都初始化为1了……因为这显然就把结果增加了。。这是因为从 d[0][0] 可以推算出后面的d[0][1,,,,100]

comments powered by Disqus