main
黄海 1 year ago
parent ec108804fe
commit 7e01663128

@ -53,9 +53,9 @@ $1≤n≤100,1≤a[i]≤25000,1≤T≤20$
大写的 <font color='red' size=4><b>简化</b></font> !明显在提示我们可以只简化,不用考虑替换成其它的货币金额啊!如果只是简化,那么简单:
* 将货币面额排序(因为给的面额是无序的)
* 将货币面额排序(因为给的面额是无序的)
* 每一个面额考查它能不能被它之前的面额描述出来,如果能,它就没有存在的必要。将这类的货币从系统中去除就可以得到等价的最小数量货币系统。
* 每一个面额考查它能不能被它之前的面额描述出来,如果能,它就没有存在的必要。将这类的货币从系统中去除就可以得到等价的最小数量货币系统。
可以用$dp$求出能表示该面额的方案数,若对于一张货币方案数唯一(即只能被自己表示),则这张货币不能被省略,反之可以被省略,最后统计一下就行了。

@ -278,4 +278,31 @@ int main() {
**[$AcWing$ $1021$. 货币系统 ](https://www.acwing.com/problem/content/1023/)**
完全背包之恰好装满,只不过$int$装不下,需要开$long$ $long$,捎带着学习一下隔板法,应对一下高中数学组合数学。
完全背包之恰好装满,只不过$int$装不下,需要开$long$ $long$,捎带着学习一下隔板法,应对一下高中数学组合数学。
**十年$OI$一场空,不开$long$ $long$见祖宗。**
```cpp {.line-numbers}
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 20;
const int M = 3010;
int n, m;
LL v[N];
LL f[M];
int main() {
cin >> n >> m;
f[0] = 1;
for (int i = 1; i <= n; i++) {
cin >> v[i];
for (int j = v[i]; j <= m; j++)
f[j] += f[j - v[i]];
}
printf("%lld\n", f[m]);
return 0;
}
```
Loading…
Cancel
Save