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;}
原创粉丝点击