UVA
来源:互联网 发布:dns跳转另外一个域名 编辑:程序博客网 时间:2024/06/05 14:47
题目大意:有 1、5、10、25、50 五种面额的硬币,给出一个数额,问有几种方式能够组成面额。
解题思路:每种硬币都有无数个,完全背包问题。
为了避免重复计算,外层循环表示当前使用的面额,从小往大枚举,一层层累计。
#include<iostream>#include<stdio.h>#include<algorithm>#include<cmath>#include<string.h>#define max(a,b) ((a)>(b)?(a):(b))#define min(a,b) ((a)<(b)?(a):(b))const int INF = 0x3f3f3f3f;const int NINF = -INF -1;const int MAXN =7500;using namespace std;int coin[]={1, 5, 10, 25, 50};int dp[MAXN];int main() { memset(dp, 0, sizeof(dp)); dp[0] = 1; for (int i = 0; i < 5; i++) for (int j = coin[i]; j < MAXN; j++) dp[j] += dp[j-coin[i]]; int n; while (scanf("%d", &n) != EOF) printf("%d\n", dp[n]); return 0;}