Acwing 1021
Description
给你一个(n) 种面值的货币系统,求组成面值为(m) 的货币有多少种方案。
(n≤15), (m≤3000)
Solution
完全背包。
即将(n) 种货币视为有(n) 个物品,每个物品都可以取无限次,求达到(m) 重量的方案数。
考虑(f[j]) 表示达成(j) 重量的方案数,每新加入一种货币便更新答案
则转移方程为(f[j] = f[j] + f[j - a[i]] (a[i] ≤ j)).
初始值(f[0] = 1),注意要开LL。
code
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <queue>
#include <stack>
#define REP(i, x, y) for(register int i = x; i < y; i++)
#define rep(i, x, y) for(register int i = x; i <= y; i++)
#define PER(i, x, y) for(register int i = x; i > y; i--)
#define per(i, x, y) for(register int i = x; i >= y; i--)
#define lc (k << 1)
#define rc (k << 1 | 1)
using namespace std;
#define int long long
const int N = 20;
const int M = 3005;
int n, m, f[M], a[N];
signed main()
{
cin >> n >> m;
rep(i, 1, n)
{
cin >> a[i];
}
f[0] = 1;
rep(i, 1, n)
{
rep(j, a[i], m)
{
f[j] = f[j] + f[j - a[i]];
}
}
cout << f[m];
return 0;
}