乱七八糟笔记
1.乱七八糟笔记
P1450 [HAOI2008] 硬币购物
题目描述
共有
某人去商店买东西,去了
输入格式
输入的第一行是五个整数,分别代表
接下来
输出格式
对于每次购买,输出一行一个整数代表答案。
数据规模与约定
- 对于
的数据,保证 , 。
思路
1st.转化题面
求方程
其中
2nd.猜测算法
- 一.多重背包
考虑有解的重复性问题,以及数据量过大。
否决。 - 二.完全背包加容斥原理
考虑用完全背包算出所有解的数量,再用容斥原理消去错解数量。
通过。
3rd.求错解
简化方程,其中 Cn 为余项,
得
当
接下来只须枚举
但这样的话可能有重复解,用容斥原理消去即可。
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e5;
int c[10], d[10], n, s;
int f[100010], ans;
void dfs(int dep, int tmp, int num) {
if (dep > 4) {
if (!num || tmp < 0) return;
ans += (num % 2) ? f[tmp] : f[tmp] * (-1);
return;
}
dfs(dep + 1, tmp - c[dep] * (d[dep] + 1), num + 1);
dfs(dep + 1, tmp, num);
}
signed main() {
for (int i = 1; i <= 4; i++) cin >> c[i];
cin >> n;
f[0] = 1;
for (int i = 1; i <= 4; i++)
for (int j = c[i]; j <= N; j++)
f[j] += f[j - c[i]];
while(n--) {
for (int i = 1; i <= 4; i++) cin >> d[i];
cin >> s;
ans = 0;
dfs(1, s, 0);
cout << f[s] - ans << '\n';
}
return 0;
}
本文作者:CJY_QAQ
本文链接:https://www.cnblogs.com/cjyqaq/p/18740834
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步