BZOJ_1042_[HAOI2008]硬币购物_容斥原理+背包
BZOJ_1042_[HAOI2008]硬币购物_容斥原理+背包
题意:
硬币购物一共有4种硬币。面值分别为c1,c2,c3,c4。某人去商店买东西,去了tot次。每次带di枚ci硬币,买s
i的价值的东西。请问每次有多少种付款方法。
分析:
假设没有di的限制,先跑一遍完全背包
容斥,用总方案数减去有一种硬币数目不合法的方案数加上有两种硬币不合法的方案数......
怎么求这个方案数呢?
我们发现如果第i种硬币数目不合法,那它一定拿了至少(di+1)个,方案数就是f[n-(di+1)*ci]
代码:
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define LL long long
#define N 100000
LL c[5], tot, d[5], s;
LL f[N+10];
int main(){
scanf("%lld%lld%lld%lld%lld", &c[1], &c[2], &c[3], &c[4], &tot);
int i,j;
f[0] = 1;
for(i = 1;i <= 4 ;i++) {
for(j = c[i];j <= N;j++) {
f[j] += f[j - c[i]];
}
}
while(tot--) {
scanf("%lld%lld%lld%lld%lld", &d[1], &d[2], &d[3], &d[4], &s);
LL ans = f[s];
LL g1 = (d[1] + 1) * c[1];
LL g2 = (d[2] + 1) * c[2];
LL g3 = (d[3] + 1) * c[3];
LL g4 = (d[4] + 1) * c[4];
if(s - g1 >= 0) ans -= f[s - g1];
if(s - g2 >= 0) ans -= f[s - g2];
if(s - g3 >= 0) ans -= f[s - g3];
if(s - g4 >= 0) ans -= f[s - g4];
if(s - g1 - g2 >= 0) ans += f[s - g1 - g2];
if(s - g1 - g3 >= 0) ans += f[s - g1 - g3];
if(s - g1 - g4 >= 0) ans += f[s - g1 - g4];
if(s - g2 - g3 >= 0) ans += f[s - g2 - g3];
if(s - g2 - g4 >= 0) ans += f[s - g2 - g4];
if(s - g3 - g4 >= 0) ans += f[s - g3 - g4];
if(s - g1 - g2 - g3 >= 0) ans -= f[s - g1 - g2 - g3];
if(s - g1 - g2 - g4 >= 0) ans -= f[s - g1 - g2 - g4];
if(s - g1 - g3 - g4 >= 0) ans -= f[s - g1 - g3 - g4];
if(s - g2 - g3 - g4 >= 0) ans -= f[s - g2 - g3 - g4];
if(s - g1 - g2 - g3 - g4 >= 0) ans += f[s - g1 - g2 - g3 - g4];
printf("%lld\n",ans);
}
}
BZOJ_1042_[HAOI2008]硬币购物_容斥原理+背包的更多相关文章
- P1450 [HAOI2008]硬币购物(完全背包+容斥)
P1450 [HAOI2008]硬币购物 暴力做法:每次询问跑一遍多重背包. 考虑正解 其实每次跑多重背包都有一部分是被重复算的,浪费了大量时间 考虑先做一遍完全背包 算出$f[i]$表示买价值$i$ ...
- BZOJ1042 [HAOI2008]硬币购物 【完全背包 + 容斥】
1042: [HAOI2008]硬币购物 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 2924 Solved: 1802 [Submit][St ...
- BZOJ 1042: [HAOI2008]硬币购物 容斥+背包
1042: [HAOI2008]硬币购物 Description 硬币购物一共有4种硬币.面值分别为c1,c2,c3,c4.某人去商店买东西,去了tot次.每次带di枚ci硬币,买si的价值的东西.请 ...
- bzoj 1042: [HAOI2008]硬币购物 dp+容斥原理
题目链接 1042: [HAOI2008]硬币购物 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1706 Solved: 985[Submit][ ...
- BZOJ 1042:[HAOI2008]硬币购物(容斥原理+DP)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1042 [题目大意] 硬币购物一共有4种硬币.面值分别为c1,c2,c3,c4. 某人去 ...
- 2019.02.09 bzoj1042: [HAOI2008]硬币购物(完全背包+容斥原理)
传送门 题意简述:有四种面值的硬币,现在qqq次询问(q≤1000)(q\le1000)(q≤1000),每次给出四种硬币的使用上限问最后刚好凑出sss块钱的方案数(s≤100000)(s\le100 ...
- BZOJ 1042: [HAOI2008]硬币购物(容斥原理)
http://www.lydsy.com/JudgeOnline/problem.php?id=1042 题意: 思路: 如果不考虑硬币个数的话,这就是一道完全背包的题目. 直接求的话行不通,于是这里 ...
- bzoj 1042: [HAOI2008]硬币购物【容斥原理+dp】
当然是容斥啦. 用dp预处理出\( f[i] \),表示在\( i \)价格时不考虑限制的方案数,转移方程是\( f[i]+=f[i-c[j]] \),用状压枚举不满足的状态容斥一下即可. #incl ...
- Bzoj 1042: [HAOI2008]硬币购物 容斥原理,动态规划,背包dp
1042: [HAOI2008]硬币购物 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1747 Solved: 1015[Submit][Stat ...
随机推荐
- angularjs作用域之transclude
transclude是一个可选的参数.如果设置了,其值必须为true,它的默认值是false.嵌入有时被认为是一个高级主题,但某些情况下它与我们刚刚学习过的作用域之间会有非常好的配合.使用嵌入也会很好 ...
- C#逻辑面试题汇总【不断更新中】
(1)产生本月的月历,参考样式: 1 2 3 4 5 6 SU MO TU WE TH FR SA 01 02 03 04 05 06 07 08 09 10 11 12 13 14 ...
- MacOS软件默认安装路径
缘起 在用苹果电脑后,很多软件安装后并不只是简单的将所有的文件都放到/Applications目录里,尤其是一些开发用的软件.这就导致要修改一些软件的配置很不方便,总是需要各种查找.为了防止以后忘记这 ...
- EF中关于TransactionScope的使用
前提条件 TransactionScope类需要引用System.Transactions; 数据库环境及需求 现在假设有两个表如图: ...
- How 5 Natural Language Processing APIs Stack Up
https://www.programmableweb.com/news/how-5-natural-language-processing-apis-stack/analysis/2014/07/2 ...
- for循环之后的return
<C++primer>第五版中文版,201页: 在含有return语句的循环后面应该也有一条return语句,如果没有的话该程序就是错误的. 前几天编写一个函数,for循环查找某个值,找到 ...
- 哈夫曼树【最优二叉树】【Huffman】
[转载]只为让价值共享,如有侵权敬请见谅! 一.哈夫曼树的概念和定义 什么是哈夫曼树? 让我们先举一个例子. 判定树: 在很多问题的处理过程中,需要进行大量的条件判断,这些判断结构的设 ...
- RocketMQ源码 — 九、 RocketMQ延时消息
上一节消息重试里面提到了重试的消息可以被延时消费,其实除此之外,用户发送的消息也可以指定延时时间(更准确的说是延时等级),然后在指定延时时间之后投递消息,然后被consumer消费.阿里云的ons还支 ...
- 将Excel表中的数据导入到数据库
网上查到的有参考价值的就一家,自己调试发现可行.感谢原创文章:将Excel中数据导入数据库(一) using System; using System.Collections.Generic; usi ...
- maven的pom文件中指定编译的版本
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> ...