思路:完全背包加容斥原理

首先不考虑限制,那么很容易可以预处理出f[i](f[i]+=f[i-c[i]],1<=i<=4,i-c[i]>=0)。

然后考虑如何求出限制后的答案。

首先考虑这样的一个问题:x1+x2+x3+x4+x5+...+xn=m有多少组整数解。显然插板法可以解决这个问题,但如果引入对于xi的限制,令xi不能超过ri,那么这个问题就应该要用到容斥原理了。

令Si为所有满足条件的xi的集合,那么这个问题就转化为了求所有Si的交集后再用插板法的一个问题了,瓶颈就在于如何求出Si的交集,于是可以考虑容斥原理,Si的交集即全集U-所有Si补集的并集,而Si的补集也就是满足xi>ri即xi>=ri+1的xi的集合,这样令所有的xi-=(ri+1),也就是令m+=(ri+1),然后即可用容斥原理加插板法求出所有Si补集的并集,全集U即原始问题的答案,那么这样运用容斥就完美地解决了这样一个问题。

再回到我们的问题,可以发现这就是刚刚提到的问题的每一个xi乘上一个权值,那么就令m+=(ri+1)*ci即可,于是对于所有询问均可做到O(1)回答。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
#define maxn 101000 int c[],d[],num[],cases;
long long f[maxn]; int main(){
for (int i=;i<=;i++) scanf("%d",&c[i]);scanf("%d",&cases);
f[]=;
for (int i=;i<=;i++)
for (int j=c[i];j<=;j++)
f[j]+=f[j-c[i]];
num[]=;
for (int i=;i<(<<);i++) num[i]=num[i>>]*((i&)?-:);
while (cases--){
int sum;for (int i=;i<=;i++) scanf("%d",&d[i]);scanf("%d",&sum);long long ans=f[sum];
for (int i=;i<(<<);i++){
int tmp=;
for (int j=;j<;j++)
if ((<<j)&i) tmp+=(d[j+]+)*c[j+];
if (sum>=tmp) ans+=f[sum-tmp]*num[i];
}
printf("%lld\n",ans);
}
return ;
}

bzoj1402:[HAOI2008]硬币购物的更多相关文章

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

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

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

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

  3. BZOJ 1042: [HAOI2008]硬币购物( 背包dp + 容斥原理 )

    先按完全背包做一次dp, dp(x)表示x元的东西有多少种方案, 然后再容斥一下. ---------------------------------------------------------- ...

  4. BZOJ 1042: [HAOI2008]硬币购物 [容斥原理]

    1042: [HAOI2008]硬币购物 题意:4种硬币.面值分别为c1,c2,c3,c4.1000次询问每种硬币di个,凑出\(s\le 10^5\)的方案数 完全背包方案数? 询问太多了 看了题解 ...

  5. BZOJ_1042_[HAOI2008]硬币购物_容斥原理+背包

    BZOJ_1042_[HAOI2008]硬币购物_容斥原理+背包 题意: 硬币购物一共有4种硬币.面值分别为c1,c2,c3,c4.某人去商店买东西,去了tot次.每次带di枚ci硬币,买s i的价值 ...

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

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

  7. 【BZOJ】1042: [HAOI2008]硬币购物

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

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

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

  9. 【BZOJ1042】[HAOI2008]硬币购物 容斥

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

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

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

随机推荐

  1. HW2.4

    import java.util.Scanner; public class Solution { public static void main(String[] args) { final dou ...

  2. PC-XP系统忘记密码怎么办

    (一)以恢复本地用户"*****"口令为例,来说明解决忘记登录密码的步骤:1.重新启动计算机,在启动画面出现后马上按下F8键,选择"带命令行的安全模式".2.运 ...

  3. hdoj 2612 Find a way【bfs+队列】

    Find a way Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  4. java实现文件复制功能

    原理:把原文件读入到输入流里,然后利用输出流写入到新的文件. 代码如下: /** * 复制文件 * @param fromFile * @param toFile * <br/> * 20 ...

  5. mybatis generator 使用

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  6. linux下查看本机socket端口详细信息

    netstat -paut [root@OA-JRY-SY-FDEP1 nginx-]# netstat -paut Active Internet connections (servers and ...

  7. 基于Linux系统的病毒

    虽然在Linux里传播的病毒不多,但也是存在一些,我从一些安全网站搜集了一些资料. 1.病毒名称: Linux.Slapper.Worm 类别: 蠕虫 病毒资料: 感染系统:Linux 不受影响系统: ...

  8. 在MyEclipse中如何去掉JS或jsp语法错误提示!

    在MyEclipse中如何去掉JS或jsp语法错误提示! 关于在 MyEclipse 上 WEB 工程里面的 JS/JSP 经常会有语法错误提示,这是由于 MyEclipse 对其语法要求相当严格所造 ...

  9. iOS自定义UICollectionViewLayout之瀑布流

    目标效果 因为系统给我们提供的 UICollectionViewFlowLayout 布局类不能实现瀑布流的效果,如果我们想实现 瀑布流 的效果,需要自定义一个 UICollectionViewLay ...

  10. 深入理解计算机系统第二版习题解答CSAPP 2.1

    A.将0x39A7F8转换为二进制. 0011 1001  1010 0111  1111 1000 B.将二进制1100 1001 0111 1011转换为十六进制. 0xC97B C.将0xD5E ...