题面:https://www.cnblogs.com/fu3638/p/6759919.html

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

  请问每次有多少种付款方法。其中di,s<=100000,tot<=1000。

  题解:
    首先考虑一个简单的问题,如果去掉题目中对于个数的限制,即给你四种面值的的硬币,问你有多少种方案能凑成
  si的价值。欸我们瞬间发现这是个完全背包的裸题,那果断乱搞。
    首先我们做一遍完全背包,定义f[i]为凑成i价值的方案数。
    接下来回到原题,我们发现题目加了一个di的限制,那怎么办呢(摸摸脑袋)。
    经过冷静的分析(查题解),发现这题可以用容斥原理乱搞。
    通过容斥原理,我们得出ans=全部方案(不考虑限制(即f[ans]))-Σ一种面值超过限制的方案数+Σ两种超限-Σ三种超限+Σ四种超限。
    那么如何求有几种超过限制的方案数呢
    以一种面值超过限制的方案数为例,那么这一种(不妨设为第i种)至少用d[i]+1个,即产生c[i]*(d[i]+1)的价值。那么剩下的s-c[i]*(d[i]+1)(记为rest)
  就可以随意取值,即为f[rest]种。
    那么两种三种的就是f[rest](rest=s-Σc[i]*(d[i]+1))。
    tip:枚举方案可以用位运算。
  代码:
#include<bits/stdc++.h>

using namespace std;

typedef long long ll;
const int maxs=;
ll ans,f[maxs+];
int c[],d[],tot,s; int main(){ scanf("%d%d%d%d%d",&c[],&c[],&c[],&c[],&tot); //完全背包预处理
f[]=;
for(int i=;i<=;i++)
for(int j=c[i];j<=maxs;j++)
f[j]+=f[j-c[i]]; for(int k=;k<=tot;k++){
scanf("%d%d%d%d%d",&d[],&d[],&d[],&d[],&s);
ans=;
for(int i=;i<(<<);i++){
int rest=s,tt=i,num=,pos=;
while(tt){
pos++;//第几枚硬币
if(tt&) rest-=c[pos]*(d[pos]+),num++;//num->几枚有限制
tt>>=;
}
if(rest<) continue;
if(num&) ans-=f[rest];
else ans+=f[rest];
}
printf("%lld\n",ans);
}
return ;
}

  参考:

    https://blog.csdn.net/aarongzk/article/details/51511564

     https://blog.csdn.net/doctor_godder/article/details/50071749


BZOJ 1042: [HAOI2008]硬币购物 (详解)(背包&容斥原理)的更多相关文章

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

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

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

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

  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]硬币购物 dp+容斥原理

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

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

    题意: 4种硬币买价值为V的商品,每种硬币有numi个,问有多少种买法 1000次询问,numi<1e5 思路: 完全背包计算出没有numi限制下的买法, 然后答案为dp[V]-(s1+s2+s ...

  7. BZOJ 1042: [HAOI2008]硬币购物 容斥原理_背包_好题

    Description 硬币购物一共有4种硬币.面值分别为c1,c2,c3,c4.某人去商店买东西,去了tot次.每次带di枚ci硬币,买s i的价值的东西.请问每次有多少种付款方法. 题解: 十分喜 ...

  8. [BZOJ 1042] [HAOI2008] 硬币购物 【DP + 容斥】

    题目链接:BZOJ - 1042 题目分析 首先 Orz Hzwer ,代码题解都是看的他的 blog. 这道题首先使用DP预处理,先求出,在不考虑每种硬币个数的限制的情况下,每个钱数有多少种拼凑方案 ...

  9. [bzoj 1042][HAOI2008]硬币购物(用容斥原理弄背包)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1042 分析: 解法很巧妙,用f[i]表示四种硬币A.B.C.D的数量不考虑的情况下弄成 ...

随机推荐

  1. Git-用 cherry-pick 挑好看的小樱桃

         版权声明:本文为博主原创文章,转载请在文章明显位置标明文章原属哦. https://blog.csdn.net/qq_32452623/article/details/79449534 ti ...

  2. Java Serializable的使用和transient关键字使用小记(转载)

    一:Serializable 1.持久化的简单介绍: “持久化”意味着对象的“生存时间”并不取决于程序是否正在执行——它存在或“生存”于程序的每一次调用之间.通过序列化一个对象,将其写入磁盘,以后在程 ...

  3. [转帖]关于CP936

    来源: 知乎:https://www.zhihu.com/question/35609295/answer/63780022 CP936和UTF-8本身和Python是毫无关联的. CP936其实就是 ...

  4. 1363. ZigZag Conversion

    public class Solution { /** * @param s: the given string * @param numRows: the number of rows * @ret ...

  5. JQ判断在不同分辨率电脑下使用不同的banner尺寸

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. python设计模式第八天【装饰器模式】

    1.定义 使用包装的释放扩展类的功能,但是不使用继承 2.使用场景 3.代码实现 #!/usr/bin/env python #! _*_ coding:UTF-8 _*_ def MyDecorat ...

  7. 如何在Mac系统安装MySQL

    方法一: (1)使用brew install mysql (2)使用mysql -uroot连接时报错: Authentication plugin 'caching_sha2_password' c ...

  8. Delphi数据集与记录

    1.1Delphi数据库应用程序的层次结构 Delphi数据库应用程序通过数据存取构件对数据库进行访问,通过可视的数据构件(Data Control)将数据呈现给用户,并与用户进行交互.Delphi数 ...

  9. Lodop打印控件指定打印任务某几页

    使用Lodop打印控件进行打印开发,有时候一个任务里有多页,例如各种合同之类的,客户端用户在使用过程中,可能有某一页打印后发现需要修改,这时候不必再把整个任务重新打印一遍,只需要打印需要修改的那页重新 ...

  10. Ftp、Ftps与Sftp之间的区别

    Ftp FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为“文传协议”.用于Internet上的控制文件的双向传输.同时,它也是一个应用程序(Applica ...