洛谷P1450 [HAOI2008]硬币购物 背包+容斥
无限背包+容斥?
观察数据范围,可重背包无法通过,假设没有数量限制,利用用无限背包
进行预处理,因为实际硬币数有限,考虑减掉多加的部分
如何减?利用容斥原理,减掉不符合第一枚硬币数的,第二枚,依次类推
加上不符第一枚和第二枚的方案,第一枚和第三枚的方案以此类推,不明
白原理可以去看一下容斥原理
较长代码(懒得优化)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#define ll long long
using namespace std;
const int maxn=1e5+10;
inline int read(){
int ret=0;
int f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')
f=-f;
ch=getchar();
}
while(ch<='9'&&ch>='0'){
ret=ret*10+(ch^'0');
ch=getchar();
}
return f*ret;
}
int c[5];
ll s;
ll dp[maxn];
int n;
ll ans;
ll d[5];
ll getn(int x){
return (d[x]+1)*c[x];
}
int main(){
// freopen("a.txt","r",stdin);
for(int i=1;i<=4;i++){
// c[i]=read();
cin>>c[i];
}
cin>>n;
// n=read();
// cout<<n;
dp[0]=1;
// cout<<dp[-10]<<endl;
for(int i=1;i<=4;i++){
for(int j=c[i];j<=maxn;j++){
dp[j]+=dp[j-c[i]];
}
}
// cout<<dp[10]<<endl;
while(n){
n--;
for(int i=1;i<=4;i++){
//d[i]=read();
cin>>d[i];
}
// s=read();
cin>>s;
ans=dp[s];
for(int i=1;i<=4;i++){
if(s>=getn(i)){
ans-=dp[s-getn(i)];
}
}
if(s>=getn(1)+getn(2)){
ans+=dp[s-getn(1)-getn(2)];
}
if(s>=getn(2)+getn(3)){
ans+=dp[s-getn(2)-getn(3)];
}
if(s>=getn(3)+getn(4)){
ans+=dp[s-getn(3)-getn(4)];
}
if(s>=getn(1)+getn(4)){
ans+=dp[s-getn(1)-getn(4)];
}
if(s>=getn(2)+getn(4)){
ans+=dp[s-getn(4)-getn(2)];
}
if(s>=getn(1)+getn(3)){
ans+=dp[s-getn(1)-getn(3)];
}
if(s>=getn(1)+getn(2)+getn(3)){
ans-=dp[s-getn(1)-getn(2)-getn(3)];
}
if(s>=getn(1)+getn(2)+getn(4)){
ans-=dp[s-getn(1)-getn(2)-getn(4)];
}
if(s>=getn(1)+getn(3)+getn(4)){
ans-=dp[s-getn(1)-getn(3)-getn(4)];
}
if(s>=getn(4)+getn(2)+getn(3)){
ans-=dp[s-getn(4)-getn(2)-getn(3)];
}
if(s>=getn(1)+getn(2)+getn(3)+getn(4)){
ans+=dp[s-getn(1)-getn(2)-getn(3)-getn(4)];
}
cout<<ans<<endl;
}
return 0;
}
完结撒花
洛谷P1450 [HAOI2008]硬币购物 背包+容斥的更多相关文章
- 洛谷—— P1450 [HAOI2008]硬币购物
P1450 [HAOI2008]硬币购物 硬币购物一共有$4$种硬币.面值分别为$c1,c2,c3,c4$.某人去商店买东西,去了$tot$次.每次带$di$枚$ci$硬币,买$si$的价值的东西.请 ...
- 洛谷P1450 [HAOI2008]硬币购物(背包问题,容斥原理)
洛谷题目传送门 我实在是太弱了,第一次正儿八经写背包DP,第一次领会如此巧妙的容斥原理的应用...... 对每次询问都做一遍多重背包,显然T飞,就不考虑了 关键就在于每次询问如何利用重复的信息 我这么 ...
- 洛谷P1450 [HAOI2008]硬币购物
题目描述 硬币购物一共有4种硬币.面值分别为c1,c2,c3,c4.某人去商店买东西,去了tot次.每次带di枚ci硬币,买si的价值的东西.请问每次有多少种付款方法. 输入输出格式 输入格式: 第一 ...
- [Luogu P1450] [HAOI2008]硬币购物 背包DP+容斥
题面 传送门:https://www.luogu.org/problemnew/show/P1450 Solution 这是一道很有意思的在背包里面做容斥的题目. 首先,我们可以很轻松地想到暴力做背包 ...
- Luogu P1450 [HAOI2008]硬币购物 背包+容斥原理
考虑如果没有个数的限制,那么就是一个完全背包,所以先跑一个完全背包,求出没有个数限制的方案数即可. 因为有个数的限制,所以容斥一下:没有1个超过限制的方案=至少0个超过限制-至少1个超过限制+至少2个 ...
- 【洛谷P1450】硬币购物
题目大意:给定 4 种面值的硬币和相应的个数,求购买 S 元商品的方案数是多少. 题解: 考虑没有硬币个数的限制的话,购买 S 元商品的方案数是多少,这个问题可以采用完全背包进行预处理. 再考虑容斥, ...
- BZOJ1042:[HAOI2008]硬币购物(DP,容斥)
Description 硬币购物一共有4种硬币.面值分别为c1,c2,c3,c4.某人去商店买东西,去了tot次.每次带di枚ci硬币,买si的价值的东西.请问每次有多少种付款方法. Input 第一 ...
- P1450 [HAOI2008]硬币购物(完全背包+容斥)
P1450 [HAOI2008]硬币购物 暴力做法:每次询问跑一遍多重背包. 考虑正解 其实每次跑多重背包都有一部分是被重复算的,浪费了大量时间 考虑先做一遍完全背包 算出$f[i]$表示买价值$i$ ...
- 2021.12.06 P1450 [HAOI2008]硬币购物(组合数学+抽屉原理+DP)
2021.12.06 P1450 [HAOI2008]硬币购物(组合数学+抽屉原理+DP) https://www.luogu.com.cn/problem/P1450 题意: 共有 44 种硬币.面 ...
随机推荐
- 终于开始了,微软的野心将通过全场景开发平台dotnet 5体现得淋漓尽致!
本文已经同步到微信公众号「极客起源」 . 现在都在谈论全场景开发,也就是用一套开发工具,可以开发包括但不限于桌面.移动.IOT.游戏.Web等平台的应用.这样对于开发人员是非常爽的.本文将介绍微软 ...
- Count(*) 与 count(field) 一样吗?
有这么个表: 执行 select count(*) from hy_test select count(deptno) from hy_test 都得到 5 但执行 select count(name ...
- leetcode刷题-75颜色分类
题目 给定一个包含红色.白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色.白色.蓝色顺序排列. 此题中,我们使用整数 0. 1 和 2 分别表示红色.白色和蓝 ...
- Visual Studio Code 下载安装
1.官网下载:https://code.visualstudio.com/ 2.下载完成后,点开如果是黑屏的话,右键勾上.
- 分布式事务框架.NetCore CAP总结
来自CAP原作者yang-xiaodong的原理图: 本文撰写者:cmliu,部分内容引用自官方文档,部分内容待更新# .NetCore CAP # 1,简介 CAP 是一个遵循 .NET Stand ...
- JVM-虚拟机执行子系统
类的加载由JVM执行引擎来完成 早期--编译期:源代码文件*.java -> 词法分析器 -> tokens流 -> 语法分析器 -> 语法树/抽象语法树 -> 语义分析 ...
- 2. 构建DNS集群
DNS是什么 DNS(Domain Name System,域名系统),是互联网上存储域名和IP映射关系的一个分布式数据库,他负责把域名转换为IP地址,或IP转换为域名,工作于OSI应用层之上,DNS ...
- [计算机网络]图解HTTP阅读笔记
总述 书的定位:一本十分浅显的HTTP书籍,主要介绍了HTTP与HTTPS.适合入门了解,很多地方都是蜻蜓点水,但稍微深入的地方能让人了解重点在哪,后面应该有针对性地阅读深入书籍. 主要内容:介绍了T ...
- FFmpeg开发笔记(五):ffmpeg解码的基本流程详解(ffmpeg3新解码api)
若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...
- leetcode560题解【前缀和+哈希】
leetcode560.和为K的子数组 题目链接 算法 前缀和+哈希 时间复杂度O(n). 在解决这道题前需要先清楚,一个和为k的子数组即为一对前缀和的差值. 1.我们假设有这么一个子数组[i,j]满 ...