链接:https://vjudge.net/problem/HDU-2069
题意:
给你面值有1,5,10,25,50的币种,然后随意输入一个钱的数目,问用这些面值刚好凑成这个钱的方法有多少个(最多100个硬币)
思路:
dp,二位数组,dp[i][j]。表示i值用j个硬币有几种方法。
好像这题有0的输入。。真坑
代码:
#include <iostream> #include <memory.h> #include <vector> #include <map> #include <algorithm> #include <cstdio> #include <math.h> #include <queue> #include <string> #include <stack> using namespace std; typedef long long LL; const int MAXN = 7500 + 10; int dp[MAXN][110]; int value[10] = {0, 1, 5, 10, 25, 50}; void Solve() { dp[0][0] = 1; for (int i = 1;i <= 5;i++) { for (int v = value[i];v <= 7500;v++) { for (int j = 1;j <= 100;j++) dp[v][j] += dp[v - value[i]][j - 1]; } } } int main() { int n; Solve(); while (~scanf("%d", &n)) { int res = 0; for (int i = 0;i <= 100;i++) res += dp[n][i]; printf("%d\n", res); } return 0; }