BZOJ 1042: [HAOI2008]硬币购物 容斥原理_背包_好题
Description
  硬币购物一共有4种硬币。面值分别为c1,c2,c3,c4。某人去商店买东西,去了tot次。每次带di枚ci硬币,买s
i的价值的东西。请问每次有多少种付款方法。
题解:
容斥原理公式:(源自百度百科)

十分喜欢这道题,真的非常巧妙.
不加限制,该题会变得特别模板.
有限制后,似乎正着求有些困难,我们就考虑反着求,即简单容斥一下. 
我们先求出不加限制的方案数,再将不合法的方案数依次减掉. 
考虑容斥原理:
总方案 - $\sum$ 1个不合法 + $\sum$ 2个不合法 - $\sum$ 3个不合法......
假设不加限制的总个数为 $N$ ,第一物品的限制为 $d$ (一共4个物品),那么当我们拿 $d+1$,$d+2$.... 个物品的时候开始不合法.
也就是说,不合法的情况下,我们至少拿 $d+1$ 个1物品,剩下的由 1,2,3,4随便拼凑.
而剩下的四个物品随便拼凑不就是 $DP[N-(d+1)*val_{1}]$  嘛......
其余情况同理.
Code:
#include<bits/stdc++.h>
#define setIO(s) freopen(s".in","r",stdin)
#define maxn 1000000
#define N 200000
#define ll long long
using namespace std;
int c[5],d[5];
ll dp[maxn];
int main(){
//setIO("input");
for(int i=0;i<4;++i) scanf("%d",&c[i]);
dp[0]=1;
for(int i=0;i<4;++i) for(int j=c[i];j<=N;++j) dp[j]+=dp[j-c[i]];
int T;
scanf("%d",&T);
while(T--){
for(int i=0;i<4;++i) scanf("%d",&d[i]);
int res;
scanf("%d",&res);
ll ans=0;
for(int i=0;i<16;++i){
int cnt=0,cur=res;
for(int j=0;j<4;++j) if((i>>j)&1) cnt^=1,cur-=(d[j]+1)*c[j];
if(cur<0) continue;
if(cnt) ans-=dp[cur]; else ans+=dp[cur];
}
printf("%lld\n",ans);
}
return 0;
}
BZOJ 1042: [HAOI2008]硬币购物 容斥原理_背包_好题的更多相关文章
- Bzoj 1042: [HAOI2008]硬币购物  容斥原理,动态规划,背包dp
		1042: [HAOI2008]硬币购物 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1747 Solved: 1015[Submit][Stat ... 
- BZOJ 1042: [HAOI2008]硬币购物 [容斥原理]
		1042: [HAOI2008]硬币购物 题意:4种硬币.面值分别为c1,c2,c3,c4.1000次询问每种硬币di个,凑出\(s\le 10^5\)的方案数 完全背包方案数? 询问太多了 看了题解 ... 
- BZOJ 1042: [HAOI2008]硬币购物 容斥+背包
		1042: [HAOI2008]硬币购物 Description 硬币购物一共有4种硬币.面值分别为c1,c2,c3,c4.某人去商店买东西,去了tot次.每次带di枚ci硬币,买si的价值的东西.请 ... 
- BZOJ 1042: [HAOI2008]硬币购物( 背包dp + 容斥原理 )
		先按完全背包做一次dp, dp(x)表示x元的东西有多少种方案, 然后再容斥一下. ---------------------------------------------------------- ... 
- bzoj 1042: [HAOI2008]硬币购物   dp+容斥原理
		题目链接 1042: [HAOI2008]硬币购物 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1706 Solved: 985[Submit][ ... 
- BZOJ 1042 [HAOI2008]硬币购物(完全背包+容斥)
		题意: 4种硬币买价值为V的商品,每种硬币有numi个,问有多少种买法 1000次询问,numi<1e5 思路: 完全背包计算出没有numi限制下的买法, 然后答案为dp[V]-(s1+s2+s ... 
- BZOJ 1042: [HAOI2008]硬币购物 (详解)(背包&容斥原理)
		题面:https://www.cnblogs.com/fu3638/p/6759919.html 硬币购物一共有4种硬币.面值分别为c1,c2,c3,c4.某人去商店买东西,去了tot次.每次带di枚 ... 
- [BZOJ 1042] [HAOI2008] 硬币购物 【DP + 容斥】
		题目链接:BZOJ - 1042 题目分析 首先 Orz Hzwer ,代码题解都是看的他的 blog. 这道题首先使用DP预处理,先求出,在不考虑每种硬币个数的限制的情况下,每个钱数有多少种拼凑方案 ... 
- [bzoj 1042][HAOI2008]硬币购物(用容斥原理弄背包)
		题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1042 分析: 解法很巧妙,用f[i]表示四种硬币A.B.C.D的数量不考虑的情况下弄成 ... 
随机推荐
- 关于使用sudo命令后找不到JAVA_HOME的问题
			今天在虚拟机搭建zookeeper环境,结果死活运行不起来,唯一的信息只有out文件里“没有java命令”这一个提示,找来找去发现是找不到java运行环境.可是很奇怪,明明我已经配置了,而且在终端执行 ... 
- IT人才异军突起 有招网引领业界精英
			随着网络时代的到来,IT人才也在不断的增长.当然,不仅IT行业对IT人才需求旺盛.部分传统企业为打造互联网时代下的企业,也在紧锣密鼓的招聘IT人才.据统计.眼下我国各地对IT人才的需求已经占领总体人才 ... 
- HDU 5291(Candy Distribution-差值dp)
			Candy Distribution Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Other ... 
- eclipse配置默认的jdk
			1.window-preferences-java-Installed JREs-Add-Standard VM-[添加jre6或jre7的路径] 
- ORACLE 按表字段值的不同统计数量
			select p.id comperitorId,p.compcorp competitorName, sum(case when c.kindname = 'ATM' then c.num else ... 
- VIM中括号的自动补全与删除
			先放来源 http://oldj.net/article/vim-parenthesis/ 很多现代 IDE 都有自动补全配对括号的功能,比如输入了左括号“(”,IDE 就自动在后面添加一个对应的右括 ... 
- hdu 1002(大数)
			A + B Problem II Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ... 
- [SCOI 2010] 股票交易
			[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1855 [算法] 单调队列优化动态规划 [代码] #include<bits/s ... 
- Node.js:事件循环
			ylbtech-Node.js:事件循环 1.返回顶部 1. Node.js 事件循环 Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高. Node.js 的每一个 ... 
- Arduino-1602-LiquidCrystal库
			前言:LiquidCrystal是一个1602的IIC库,使用IIC协议可以极大节约用线数量,十分方便.当然,前提是1602要使用LCD1602 I2C模块. 一.库函数快速查询 LiquidCrys ... 
