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]硬币购物_容斥原理+背包的更多相关文章

  1. P1450 [HAOI2008]硬币购物(完全背包+容斥)

    P1450 [HAOI2008]硬币购物 暴力做法:每次询问跑一遍多重背包. 考虑正解 其实每次跑多重背包都有一部分是被重复算的,浪费了大量时间 考虑先做一遍完全背包 算出$f[i]$表示买价值$i$ ...

  2. BZOJ1042 [HAOI2008]硬币购物 【完全背包 + 容斥】

    1042: [HAOI2008]硬币购物 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 2924  Solved: 1802 [Submit][St ...

  3. BZOJ 1042: [HAOI2008]硬币购物 容斥+背包

    1042: [HAOI2008]硬币购物 Description 硬币购物一共有4种硬币.面值分别为c1,c2,c3,c4.某人去商店买东西,去了tot次.每次带di枚ci硬币,买si的价值的东西.请 ...

  4. bzoj 1042: [HAOI2008]硬币购物 dp+容斥原理

    题目链接 1042: [HAOI2008]硬币购物 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1706  Solved: 985[Submit][ ...

  5. BZOJ 1042:[HAOI2008]硬币购物(容斥原理+DP)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1042 [题目大意] 硬币购物一共有4种硬币.面值分别为c1,c2,c3,c4. 某人去 ...

  6. 2019.02.09 bzoj1042: [HAOI2008]硬币购物(完全背包+容斥原理)

    传送门 题意简述:有四种面值的硬币,现在qqq次询问(q≤1000)(q\le1000)(q≤1000),每次给出四种硬币的使用上限问最后刚好凑出sss块钱的方案数(s≤100000)(s\le100 ...

  7. BZOJ 1042: [HAOI2008]硬币购物(容斥原理)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1042 题意: 思路: 如果不考虑硬币个数的话,这就是一道完全背包的题目. 直接求的话行不通,于是这里 ...

  8. bzoj 1042: [HAOI2008]硬币购物【容斥原理+dp】

    当然是容斥啦. 用dp预处理出\( f[i] \),表示在\( i \)价格时不考虑限制的方案数,转移方程是\( f[i]+=f[i-c[j]] \),用状压枚举不满足的状态容斥一下即可. #incl ...

  9. Bzoj 1042: [HAOI2008]硬币购物 容斥原理,动态规划,背包dp

    1042: [HAOI2008]硬币购物 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1747  Solved: 1015[Submit][Stat ...

随机推荐

  1. 用PULL解析器解析XML文件

    第一种方式(简洁,直接用pullparser.nextText()来返回下一个String类型的值): 1 package lee.service; 2 3 import java.io.InputS ...

  2. PL/SQL 设置

    1.如何批量导出建表语句?    通过菜单选择[Tools]–>[Export User Objects...],在打开的窗口中选择准备导出的表即可. 通过此种方式导出的sql脚本中不会有ins ...

  3. Emit方式调用方法

    object objRet = Delegate.CreateDelegate(typeof(Func<Guid, int, decimal>), inst, "HelloWor ...

  4. Msys+MinGW编译VLC

      说明:本文只是对官方文档进行简单的翻译总结,旨在帮助一些英文不太好的朋友.官方文档请见wiki.videolan.org/Win32CompileMSYSNew. Msys是MinGW的一个辅助工 ...

  5. 关于运行springboot时报Unregistering JMX-exposed beans on shutdown的解决方案

    其实这个错误并不影响程序的运行,但是对于处女座的同仁来说,看到报错难免不舒服,那么看看解决方法,此错误信息的意思是说:在关机状态下未注册jmx暴露的bean. 解决方案是在入口类上加上  @Enabl ...

  6. maven jsp out.print()request.getParameter() 爆红

    如图: 解决方案: 在pom文件中添加依赖: <!-- https://mvnrepository.com/artifact/javax.servlet.jsp/jsp-api -->&l ...

  7. java书写、数据类型、数组定义

    这里只记录java与php.javascript不同的地方,相同的地方就不赘述了. 1.java文件源码为以.java为后缀的文件,字节码文件是以.class为后缀的文件. 2.写好一个java源码之 ...

  8. 利用分支限界法求解单源最短路(Dijkstra)问题

    分支限界法定义:采用Best fist search算法,并使用剪枝函数的算法称为分支界限法. 分支限界法解释:按Best first的原则,有选择的在其child中进行扩展,从而舍弃不含有最优解的分 ...

  9. 重温《STL源码剖析》笔记 第三章

    源码之前,了无秘密. --侯杰 第三章:迭代器概念与traits编程技法 迭代器是一种smart pointer auto_Ptr 是一个用来包装原生指针(native pointer)的对象,声明狼 ...

  10. ORACLE 数据库选择性导出表中数据&导入已存在表数据

    在dos界面下选择性导出表中的数据语句为: exp his/linker@orcl tables=(sysreprot) file="D:\20131218.dmp" query= ...