Luogu-P1450 [HAOI2008]硬币购物-完全背包+容斥定理
Luogu-P1450 [HAOI2008]硬币购物-完全背包+容斥定理

【Problem Description】
略
【Solution】
上述题目等价于:有\(4\)种物品,每种物品有\(d_i\)个,且每种物品的体积为\(c_i\),问有多少种方法装满容量为\(s\)的背包?可以很容易想到跑多重背包即可,但是发现复杂度为\(O(4V\cdot n)\)。不可行。
题目要求的东西也等价于求以下等式有多少组满足条件的解:
\]
如果学过容斥定理的,就可以看出来这是容斥定理的一个模型。
即先不考虑\(x_1,x_2,x_3,x_4\)的上界限制条件,即每种物品有无限多个,那么就可以跑完全背包求得所有的方案数,令\(\overline A_1,\overline A_2,\overline A_3,\overline A_4\)分别代表\(0\le x1\le d_1,\ 0\le x_2\le d_2,\ 0\le x_3\le d_3,\ 0\le x_4\le d_4\)的条件,那么我们要求的就是满足\(\overline A_1\cap \overline A_2\cap \overline A_3\cap \overline A_4\)的方案数。有容斥原理公式得:
\]
对于\(|A_1|\),我们知道\(A_1\Leftrightarrow x_1\ge d_1+1\)。所以\(|A_1|\)就表示\(x_1\ge d_1+1,\ x_2,x_3,x_4\ge 0\)时以下等式的解的个数:
\]
令\(z_1=x_1-(d_1+1),z_2=x_2,z_3=x_3,z_4=x_4\),则原式变为在\(z_1,z_2,z_3,z_4\ge 0\)的条件下,求以下等式解的个数:
\]
预处理\(10^5\)以内容量为\(i\)方案数\(dp[i]\)。则\(|A_1|=dp[s-(d_1+1)]\)。同理\(|A_i|=dp[s-(d_i+1)]\)。
对于\(|A_1\cap A_2|\)等其他子集,也用类似方法转换为完全背包的做法。因为物品数只有\(4\)个,所以用位运算枚举子集,偶加奇数减即可。详细请看代码。复杂度为\(O(4V+2^4\cdot n)\)。
【Code】
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
#define int long long
#define INF 0x3f3f3f3f
#define maxn 100005
int dp[maxn];
int c[5],d[5];
void CompleteBack(int V,int vol){ //完全背包
for(int j=vol;j<=V;j++){
dp[j]=dp[j]+dp[j-vol];
}
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
cin>>c[0]>>c[1]>>c[2]>>c[3];
dp[0]=1;
for(int i=0;i<4;i++){
CompleteBack(maxn-5,c[i]);
}
int n;cin>>n;
while(n--){
cin>>d[0]>>d[1]>>d[2]>>d[3];int s;cin>>s;
int ans=0;
for(int i=0;i<(1<<4);i++){ //枚举子集
int sum=s,num=0;
for(int j=0;j<4;j++){
if(i>>j&1){
sum-=c[j]*(d[j]+1); num++;
}
}
if(sum<0) continue;
if(num&1) ans-=dp[sum]; //偶加奇减
else ans+=dp[sum];
}
cout<<ans<<endl;
}
return 0;
}
Luogu-P1450 [HAOI2008]硬币购物-完全背包+容斥定理的更多相关文章
- BZOJ 1042 [HAOI2008]硬币购物(完全背包+容斥)
题意: 4种硬币买价值为V的商品,每种硬币有numi个,问有多少种买法 1000次询问,numi<1e5 思路: 完全背包计算出没有numi限制下的买法, 然后答案为dp[V]-(s1+s2+s ...
- [Luogu P1450] [HAOI2008]硬币购物 背包DP+容斥
题面 传送门:https://www.luogu.org/problemnew/show/P1450 Solution 这是一道很有意思的在背包里面做容斥的题目. 首先,我们可以很轻松地想到暴力做背包 ...
- Luogu P1450 [HAOI2008]硬币购物 背包+容斥原理
考虑如果没有个数的限制,那么就是一个完全背包,所以先跑一个完全背包,求出没有个数限制的方案数即可. 因为有个数的限制,所以容斥一下:没有1个超过限制的方案=至少0个超过限制-至少1个超过限制+至少2个 ...
- Luogu P1450 [HAOI2008]硬币购物
题目 一个很自然的想法是容斥. 假如只有一种硬币,那么答案就是没有限制的情况下买\(s\)的方案数减去强制用了\(d+1\)枚情况下买\(s\)的方案数即没有限制的情况下买\(s-c(d+1)\)的方 ...
- 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的东西的方案数 然后每次询问进行一次容斥,答案为总方案数-第一种硬币超限方案-第二种超限方案-第三 ...
- P1450 [HAOI2008]硬币购物(完全背包+容斥)
P1450 [HAOI2008]硬币购物 暴力做法:每次询问跑一遍多重背包. 考虑正解 其实每次跑多重背包都有一部分是被重复算的,浪费了大量时间 考虑先做一遍完全背包 算出$f[i]$表示买价值$i$ ...
- 洛谷—— P1450 [HAOI2008]硬币购物
P1450 [HAOI2008]硬币购物 硬币购物一共有$4$种硬币.面值分别为$c1,c2,c3,c4$.某人去商店买东西,去了$tot$次.每次带$di$枚$ci$硬币,买$si$的价值的东西.请 ...
随机推荐
- [LeetCode] 360. Sort Transformed Array 排序转换后的数组
Given a sorted array of integers nums and integer values a, b and c. Apply a function of the form f( ...
- [LeetCode] 636. Exclusive Time of Functions 函数的独家时间
Given the running logs of n functions that are executed in a nonpreemptive single threaded CPU, find ...
- acme自动证书申请
安装acme.sh curl https://get.acme.sh | sh acme.sh默认安装到了当前家目录. [root@iZbp17hycbhnayg00ohec9Z ~]# ~/.acm ...
- grok语法定义
grok默认表达式 Logstash 内置了120种默认表达式,可以查看patterns,里面对表达式做了分组,每个文件为一组,文件内部有对应的表达式模式.下面只是部分常用的. 常用表达式 表达式标识 ...
- DHCP配置实例(含DHCP中继代理)
https://blog.51cto.com/yuanbin/109759. DHCP配置实例(含DHCP中继代理) 某公司局域网有192.168.1.0/24和192.168.2.0/24这两个 ...
- JavaScript原生封装ajax请求和Jquery中的ajax请求
前言:ajax的神奇之处在于JavaScript 可在不重载页面的情况与 Web 服务器交换数据,即在不需要刷新页面的情况下,就可以产生局部刷新的效果.Ajax 在浏览器与 Web 服务器之间使用异步 ...
- spring的面试
IOC IOC(Inversion Of Controll,控制反转)是一种设计思想,将原本在程序中手动创建对象的控制权,交由给Spring框架来管理.IOC容器是Spring用来实现IOC的载体,I ...
- 【剑指offer】面试题 14. 剪绳子
面试题 14. 剪绳子 LeetCode 题目描述 给你一根长度为 n 的绳子,请把绳子剪成 m 段(m.n 都是整数,n>1 并且 m>1),每段绳子的长度记为 k[0],k[1],·· ...
- 手写简化版SpringBoot
Springboot项目全部依赖注解的,web工程是如何启动的 1 首先引入了Tomcat依赖,然后用java代码启动Tomcat容器,默认Tomcat版本是8.5版本 2 Tomcat是实现了ser ...
- linux net通信 基于密钥
配置SSHD服务 SSH(Secure Shell)是一种能够以安全的方式提供远程登录的协议,也是目前远程管理 Linux 系统的首选方式.在此之前,一般使用 FTP 或 Telnet 来进行远程登录 ...