HDU 2069 Coin Change(二维背包)

题目链接:点击这里
在这里插入图片描述

题意:有 5 5 种面值的硬币,即 1 1 分、 5 5 分、 10 10 分、 25 25 分、 50 50 分。输入一个钱数 s s ,输出组合方案的数量。 s 250 s\leq250 ,硬币数量 n u m 100 num\leq100

例如 11 11 分有 4 4 种组合方案,即 11 11 1 1 分、 2 2 5 5 分 + 1 1 1 1 分、 1 1 5 5 分 + 6 6 1 1 分、 1 1 10 10 分 + 1 1 1 1

第一眼没有看到有硬币数量的限制,当成完全背包求方案数来做的,WA。

既然有总金额和总数量的限制,我们可以考虑成二维费用的背包问题。

每个硬币又如完全背包,故采用顺序的循环。

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>

using namespace std;
const int N = 260, M = 110;     // N总金额,M总数量

int a[5] = {1, 5, 10, 25, 50};      // 面值

int f[N][M];

int main()
{
    f[0][0] = 1;
	for(int i = 0; i < 5; ++i)
	{
		for(int j = a[i]; j <= 250; ++j)
		{
			for(int k = 1; k <= 100; ++k)
			{
				f[j][k] += f[j - a[i]][k - 1];
			}
		}
	}
	
	int n;
	while(cin>>n)
	{
	    int ans = 0;
	    for(int i = 0; i <= 100; ++i)   ans += f[n][i];
	    cout<<ans<<endl;
	}
	
	return 0;
}
发布了844 篇原创文章 · 获赞 135 · 访问量 15万+

猜你喜欢

转载自blog.csdn.net/qq_42815188/article/details/103492254