洛谷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 种硬币.面 ...
随机推荐
- Spine应用--使用Spine动画制作动作游戏
在前面的文章中,已经陆陆续续的讲解了一些使用Spine动画的细节,有了这些细节,我们已经满足了在unity中使用Spine动画制作动作游戏的技术基础. 那么,要使用Spine动画在unity中制作一款 ...
- 想要使用GPU进行加速?那你必须事先了解CUDA和cuDNN
这一期我们来介绍如何在Windows上安装CUDA,使得对图像数据处理的速度大大加快,在正式的下载与安装之前,首先一起学习一下预导知识,让大家知道为什么使用GPU可以加速对图像的处理和计算,以及自己的 ...
- 使用java爬虫从雪球网下载股票数据
雪球网也是采用Ajax方式展示数据,我依然采用开发者工具查看其访问地址和返回数据. 访问使用到的库是jsoup,解析返回的json用的类库是jackson,二者的依赖是: <!-- jsoup ...
- Oracle中创建千万级大表归纳
从一月至今,我总共归纳了三种创建千万级大表的方案,它们是: 下面是这三种方案的对比表格: # 名称 地址 主要机制 速度 1 在Oracle中十分钟内创建一张千万级别的表 https://www.cn ...
- wfuzz 安装
wfuzz 安装 win10 下的wfuzz安装 fuzz下载 https://github.com/xmendez/wfuzz 安装遇到的问题 0x1报错 解决方法: 更新pip python -m ...
- graph attention network(ICLR2018)官方代码详解(tensorflow)-稀疏矩阵版
论文地址:https://arxiv.org/abs/1710.10903 代码地址: https://github.com/Diego999/pyGAT 之前非稀疏矩阵版的解读:https://ww ...
- Tomcat 第一篇:源码导入 IDEA 编辑器
1 引言 做 Java 的同学应该都见过上面这只名字叫 Tomcat 的猫,毕竟这只猫在过去和现在都是全球最流行的 Web 容器之一. 很有意思的一件事儿是从我接触这只猫开始,从来不知道它的中文名字是 ...
- Prometheus Metrics 设计的最佳实践和应用实例,看这篇够了!
Prometheus 是一个开源的监控解决方案,部署简单易使用,难点在于如何设计符合特定需求的 Metrics 去全面高效地反映系统实时状态,以助力故障问题的发现与定位.本文即基于最佳实践的 Metr ...
- redis实现计数器
用redis实现计数器 社交产品业务里有很多统计计数的功能,比如: 用户: 总点赞数,关注数,粉丝数 帖子: 点赞数,评论数,热度 消息: 已读,未读,红点消息数 话题: 阅读数,帖子数,收藏数 统计 ...
- Mac部署spark2.4.4
环境信息 操作系统:macOS Mojave 10.14.6 JDK:1.8.0_211 (安装位置:/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jd ...