P1450 [HAOI2008]硬币购物(完全背包+容斥)
暴力做法:每次询问跑一遍多重背包。
考虑正解
其实每次跑多重背包都有一部分是被重复算的,浪费了大量时间
考虑先做一遍完全背包
算出$f[i]$表示买价值$i$东西的方案数
蓝后对每次询问价值$t$,减去不合法的方案
$c_1$超额方案$f[t-c_1*(d_1+1)]$,表示取了$d_1+1$个$c_1$,剩下随便取的方案数(这就是差分数组)
如法炮制,减去$c_2,c_3,c_4$的超额方案数
但是我们发现,我们多减了$(c_1,c_2),(c_1,c_3),(c_1,c_4)......$同时超额的方案数
于是就再把方案数$f[t-c_i*(d_i+1)-c_j*(d_j+1)]$给加回来
然鹅我们又多加上了$(c_1,c_2,c_3)....$3种硬币同时超额的方案数,于是又要减掉这些方案
最后再把4种硬币都超额的方案数加回来
这就是容斥辣
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- using namespace std;
- typedef long long ll;
- ll ans,f[];
- int c[],d[],T,t;
- int main(){
- scanf("%d%d%d%d%d",&c[],&c[],&c[],&c[],&T);
- f[]=;
- for(int i=;i<=;i++)
- for(int j=c[i];j<=;++j)
- f[j]+=f[j-c[i]];//预处理
- while(T--){
- scanf("%d%d%d%d%d",&d[],&d[],&d[],&d[],&t);
- ans=f[t];
- for(int i=;i<;++i){//二进制枚举子集
- ll now=t,k=;
- for(int j=;j<=;++j)
- if((i&(<<j)))
- k=-k,now-=c[j]*(d[j]+);
- if(now>=) ans+=k*f[now];
- }printf("%lld\n",ans);
- }return ;
- }
P1450 [HAOI2008]硬币购物(完全背包+容斥)的更多相关文章
- Luogu-P1450 [HAOI2008]硬币购物-完全背包+容斥定理
Luogu-P1450 [HAOI2008]硬币购物-完全背包+容斥定理 [Problem Description] 略 [Solution] 上述题目等价于:有\(4\)种物品,每种物品有\(d_i ...
- BZOJ 1042 [HAOI2008]硬币购物(完全背包+容斥)
题意: 4种硬币买价值为V的商品,每种硬币有numi个,问有多少种买法 1000次询问,numi<1e5 思路: 完全背包计算出没有numi限制下的买法, 然后答案为dp[V]-(s1+s2+s ...
- BZOJ-1042:硬币购物(背包+容斥)
题意:硬币购物一共有4种硬币.面值分别为c1,c2,c3,c4.某人去商店买东西,去了tot次.每次带di枚ci硬币,买si的价值的东西.请问每次有多少种付款方法. 思路:这么老的题,居然今天才做到. ...
- [BZOJ 1042] [HAOI2008] 硬币购物 【DP + 容斥】
题目链接:BZOJ - 1042 题目分析 首先 Orz Hzwer ,代码题解都是看的他的 blog. 这道题首先使用DP预处理,先求出,在不考虑每种硬币个数的限制的情况下,每个钱数有多少种拼凑方案 ...
- bzoj1042: [HAOI2008]硬币购物(DP+容斥)
1600+人过的题排#32还不错嘿嘿 浴谷夏令营讲过的题,居然1A了 预处理出f[i]表示购买价值为i的东西的方案数 然后每次询问进行一次容斥,答案为总方案数-第一种硬币超限方案-第二种超限方案-第三 ...
- [Luogu P1450] [HAOI2008]硬币购物 背包DP+容斥
题面 传送门:https://www.luogu.org/problemnew/show/P1450 Solution 这是一道很有意思的在背包里面做容斥的题目. 首先,我们可以很轻松地想到暴力做背包 ...
- 洛谷—— P1450 [HAOI2008]硬币购物
P1450 [HAOI2008]硬币购物 硬币购物一共有$4$种硬币.面值分别为$c1,c2,c3,c4$.某人去商店买东西,去了$tot$次.每次带$di$枚$ci$硬币,买$si$的价值的东西.请 ...
- 2021.12.06 P1450 [HAOI2008]硬币购物(组合数学+抽屉原理+DP)
2021.12.06 P1450 [HAOI2008]硬币购物(组合数学+抽屉原理+DP) https://www.luogu.com.cn/problem/P1450 题意: 共有 44 种硬币.面 ...
- 洛谷P1450 [HAOI2008]硬币购物 背包+容斥
无限背包+容斥? 观察数据范围,可重背包无法通过,假设没有数量限制,利用用无限背包 进行预处理,因为实际硬币数有限,考虑减掉多加的部分 如何减?利用容斥原理,减掉不符合第一枚硬币数的,第二枚,依次类推 ...
随机推荐
- ECC椭圆曲线以及计算出公钥的过程(BTC为例)
ECC概念 全称 “ Ellipse Curve Cryptography ” means “ 椭圆 曲线 密码学 ”. 传统加密方法大多基于大质数因子分解困难性来实现,ECC则是通过椭圆曲线方程式 ...
- 自学stm32就要记住入了这个“大坑”要耐得住寂寞
在现在的MCU使用量中,STM32绝对是翘楚!因为现在使用STM32开发产品的公司非常多,这主要得益于ST公司对自家MCU的大力推广,而且ST对自己MCU也配套了一系列开发软件,也有相应的硬件开发板供 ...
- flask读书笔记
学习flask的一个很好的网站:http://www.pythondoc.com/flask-mega-tutorial/helloworld.html ======================= ...
- java script基本数据类型与数组
基本数据类型 1.undefined (var a;) 2.null (var a=null); 3.String (var a=" " or ' '); 4.boolea ...
- Spark入门到精通--(第十节)环境搭建(ZooKeeper和kafka搭建)
上一节搭建完了Hive,这一节我们来搭建ZooKeeper,主要是后面的kafka需要运行在上面. ZooKeeper下载和安装 下载ZooKeeper 3.4.5软件包,可以在百度网盘进行下载.链接 ...
- L1-039. 古风排版
L1-039. 古风排版 中国的古人写文字,是从右向左竖向排版的.本题就请你编写程序,把一段文字按古风排版. 输入格式: 输入在第一行给出一个正整数N(<100),是每一列的字符数.第二行给出一 ...
- 44-0-STM32的CAN外设
1.RS-485 协议主要是把 RS-232 的信号改进成差分信号,从而大大提高了抗干扰特性: 在 RS-485 通讯网络中,节点中的串口控制器使用 RX 与 TX信号线连接到收发器上,而收发器通过差 ...
- xcode 10 模拟器报错
xcode 10(也可能是任意版本)run 模拟器时,发现会报下面的错误. This app could not be installed at this time.Could not access ...
- Angular+NodeJs+MongoDB搭建前后端程序
get请求: //angular 前端get请求 this.client.get('http://localhost:3000/id/tom').subscribe(data => { cons ...
- linux服务器情况
查看Linux 进程命令 ps -aux 或者ps -ef linux 进程很多 如果需要查找某一个进程可以使用 管道和grep命令 Linux下常用命令 grep 匹配字符 ps 查询Li ...