diff --git a/TangDou/AcWing/BeiBao/532.md b/TangDou/AcWing/BeiBao/532.md index 9568e13..219e9fc 100644 --- a/TangDou/AcWing/BeiBao/532.md +++ b/TangDou/AcWing/BeiBao/532.md @@ -53,9 +53,9 @@ $1≤n≤100,1≤a[i]≤25000,1≤T≤20$ 大写的 简化 !明显在提示我们可以只简化,不用考虑替换成其它的货币金额啊!如果只是简化,那么简单: -* 将货币面额排序(因为给的面额是无序的) +* ① 将货币面额排序(因为给的面额是无序的) -* 每一个面额考查它能不能被它之前的面额描述出来,如果能,它就没有存在的必要。将这类的货币从系统中去除就可以得到等价的最小数量货币系统。 +* ② 每一个面额考查它能不能被它之前的面额描述出来,如果能,它就没有存在的必要。将这类的货币从系统中去除就可以得到等价的最小数量货币系统。 可以用$dp$求出能表示该面额的方案数,若对于一张货币方案数唯一(即只能被自己表示),则这张货币不能被省略,反之可以被省略,最后统计一下就行了。 diff --git a/TangDou/AcWing/BeiBao/背包问题专题.md b/TangDou/AcWing/BeiBao/背包问题专题.md index e29fa9a..4f77ef3 100644 --- a/TangDou/AcWing/BeiBao/背包问题专题.md +++ b/TangDou/AcWing/BeiBao/背包问题专题.md @@ -278,4 +278,31 @@ int main() { **[$AcWing$ $1021$. 货币系统 ](https://www.acwing.com/problem/content/1023/)** -完全背包之恰好装满,只不过$int$装不下,需要开$long$ $long$,捎带着学习一下隔板法,应对一下高中数学组合数学。 \ No newline at end of file +完全背包之恰好装满,只不过$int$装不下,需要开$long$ $long$,捎带着学习一下隔板法,应对一下高中数学组合数学。 + +**十年$OI$一场空,不开$long$ $long$见祖宗。** + +```cpp {.line-numbers} +#include + +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; +} +``` \ No newline at end of file