题目链接:点击这里
题意:有 种面值的硬币,即 分、 分、 分、 分、 分。输入一个钱数 ,输出组合方案的数量。 ,硬币数量 。
例如 分有 种组合方案,即 个 分、 个 分 + 个 分、 个 分 + 个 分、 个 分 + 个 分
第一眼没有看到有硬币数量的限制,当成完全背包求方案数来做的,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;
}