UVA - 357Let Me Count The Ways(完全背包)

题目:UVA - 357Let Me Count The Ways(完全背包)

题目大意:给出N,问用1, 5, 10, 25, 50,这些硬币能够凑出N的方式有多少种。

代码:

#include <cstdio>
#include <cstring>

const int N = 5;
const int maxn = 30005;
const int coin[N] = {1, 5, 10, 25, 50};

typedef long long ll;

ll f[maxn];

void init () {

	for(int i = 1; i < maxn; i++)
		f[i] = 0;

	f[0] = 1;
	for (int i = 0; i < N; i++)
		for (int j = coin[i]; j < maxn; j++) {

			f[j] += f[j - coin[i]];
		}
}

int main () {

	int n;
	init();
	while (scanf ("%d", &n) != EOF) {

		if (f[n] == 1)
			printf ("There is only 1 way to produce %d cents change.\n", n);
		else
			printf ("There are %lld ways to produce %d cents change.\n", f[n], n);
	}
	return 0;
}
时间: 2024-10-26 00:09:46

UVA - 357Let Me Count The Ways(完全背包)的相关文章

UVA 357 Let Me Count The Ways(完全背包)

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=293 题意: 有5种硬币: 1分 5分 10分 25分 和50分. 现在给你一个面值n, 问你有多少种方法能利用上述硬币组合出n分的金钱. 分析: 典型的完全背包问题. 本题的限制条件: 硬币钱数正好等于n 本题的目的条件: 求有多少种组合方法. 所以我们令dp[i][j]==x 表示用前i种

uva 357 Let Me Count The Ways (DP)

uva 357 Let Me Count The Ways After making a purchase at a large department store, Mel's change was 17 cents. He received 1 dime, 1 nickel, and 2 pennies. Later that day, he was shopping at a convenience store. Again his change was 17 cents. This tim

uva357 Let Me Count The Ways

注意PE-- #include<iostream> #include<map> #include<string> #include<cstring> #include<cstdio> #include<cstdlib> #include<cmath> #include<queue> #include<vector> #include<algorithm> using namespace

UVA - 10280Old Wine Into New Bottles(完全背包+剪枝)

题目:UVA - 10280Old Wine Into New Bottles(完全背包+剪枝) 题目大意:现在要将旧酒装入新瓶中,每种瓶子都有最小最大的容量要求,然后给你L升酒,在给你N个瓶子,每中瓶子的规格说明也给你,每个种类的瓶子的供应是无限的,问怎样子安排这些酒才能使得剩余的酒最少. 解题思路:这题是完全背包的题目,但是一开始就被这题的数据吓到,10^9ML,然后还有100个瓶子,瓶子的最大最小容量还相差4000左右,直接去完全背包肯定超时.之后看了大神的题接,有个规律:每个种类的瓶子的

UVA 357 Let Me Count The Ways

题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=5&page=show_problem&problem=293 Dynamic programming 注意overflow. 代码如下: 1 //============================================================================ 2 //

Let Me Count The Ways

Description After making a purchase at a large department store, Mel's change was 17 cents. He received 1 dime, 1 nickel, and 2 pennies. Later that day, he was shopping at a convenience store. Again his change was 17 cents. This time he received 2 ni

UVa 242 邮票和信封(完全背包)

https://vjudge.net/problem/UVA-242 题意: 输入s(每个信封能粘贴的最多邮票数量)和若干邮票组合,选出最大连续邮资最大的一个组合(最大连续邮资也就是用s张以内的邮票来凑1,2,3,4...n,如果无法凑成n+1,那么最大值也就是n了).如果有多个最大值,则优先考虑邮票数少的,其次考虑邮票面值最大的那个更小的. 思路: 完全背包问题. 完全背包是物品无限,在这里和题意相符合,每种邮票也是可以无限使用的.最大连续邮资就相当于一个背包容量,d[i]表示当最大连续邮资为

uva 674 Coin Change(类似完全背包)

有点类似完全背包,不过最后的容量必须被充满. dp[i][j]表示在前i个物品中选择容量不超过j的最大价值. 完全背包转移方程:dp[i][j] = max(dp[i-1][j] , dp[i][j-v[i]]+w[i]) 这道题目设数组dp[i][j]表示用前j个硬币组成i的种类个数,转移方程:dp[i][j] = dp[i-1][j]+dp[i][j- a[i]]因为这里求得是解的个数,所以要用加法,完全背包是求某一种情况所以去最大的.(明天实现一下一维数 组) 代码: #include<i

UVa 242 Stamps and Envelope Size (无限背包,DP)

题意:信封上最多贴S张邮票.有N个邮票集合,每个集合有不同的面值.问哪个集合的最大连续邮资最 大,输出最大连续邮资和集合元素. 最大连续邮资是用S张以内邮票面值凑1,2,3...到n+1凑不出来了,最大连续邮资就是n.如果不止一个集合结果相 同,输出集合元素少的, 如果仍相同,输出最大面值小的. 析:这个题,紫书上写的不全,而且错了好几次,结果WA好几次. 首先这个和背包问题差不多,我们只用一维就好.dp[i]表示邮资为 i 时的最小邮票数,然后,如果dp[i] > s就该结束了. 其他的就很简