AcWing 1021. 货币系统

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;
}
posted @ 2021-05-19 20:50  panjx  阅读(39)  评论(0编辑  收藏  举报