无限背包+容斥?


观察数据范围,可重背包无法通过,假设没有数量限制,利用用无限背包

进行预处理,因为实际硬币数有限,考虑减掉多加的部分

如何减?利用容斥原理,减掉不符合第一枚硬币数的,第二枚,依次类推

加上不符第一枚和第二枚的方案,第一枚和第三枚的方案以此类推,不明

白原理可以去看一下容斥原理

较长代码(懒得优化)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#define ll long long
using namespace std;
const int maxn=1e5+10;
inline int read(){
int ret=0;
int f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')
f=-f;
ch=getchar();
}
while(ch<='9'&&ch>='0'){
ret=ret*10+(ch^'0');
ch=getchar();
}
return f*ret;
}
int c[5];
ll s;
ll dp[maxn];
int n;
ll ans;
ll d[5];
ll getn(int x){
return (d[x]+1)*c[x];
}
int main(){
// freopen("a.txt","r",stdin);
for(int i=1;i<=4;i++){
// c[i]=read();
cin>>c[i];
}
cin>>n;
// n=read();
// cout<<n;
dp[0]=1;
// cout<<dp[-10]<<endl;
for(int i=1;i<=4;i++){
for(int j=c[i];j<=maxn;j++){
dp[j]+=dp[j-c[i]];
}
}
// cout<<dp[10]<<endl;
while(n){
n--;
for(int i=1;i<=4;i++){
//d[i]=read();
cin>>d[i];
}
// s=read();
cin>>s;
ans=dp[s];
for(int i=1;i<=4;i++){
if(s>=getn(i)){
ans-=dp[s-getn(i)];
}
}
if(s>=getn(1)+getn(2)){
ans+=dp[s-getn(1)-getn(2)];
}
if(s>=getn(2)+getn(3)){
ans+=dp[s-getn(2)-getn(3)];
}
if(s>=getn(3)+getn(4)){
ans+=dp[s-getn(3)-getn(4)];
}
if(s>=getn(1)+getn(4)){
ans+=dp[s-getn(1)-getn(4)];
}
if(s>=getn(2)+getn(4)){
ans+=dp[s-getn(4)-getn(2)];
}
if(s>=getn(1)+getn(3)){
ans+=dp[s-getn(1)-getn(3)];
}
if(s>=getn(1)+getn(2)+getn(3)){
ans-=dp[s-getn(1)-getn(2)-getn(3)];
}
if(s>=getn(1)+getn(2)+getn(4)){
ans-=dp[s-getn(1)-getn(2)-getn(4)];
}
if(s>=getn(1)+getn(3)+getn(4)){
ans-=dp[s-getn(1)-getn(3)-getn(4)];
}
if(s>=getn(4)+getn(2)+getn(3)){
ans-=dp[s-getn(4)-getn(2)-getn(3)];
}
if(s>=getn(1)+getn(2)+getn(3)+getn(4)){
ans+=dp[s-getn(1)-getn(2)-getn(3)-getn(4)];
}
cout<<ans<<endl;
}
return 0;
}

完结撒花

洛谷P1450 [HAOI2008]硬币购物 背包+容斥的更多相关文章

  1. 洛谷—— P1450 [HAOI2008]硬币购物

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

  2. 洛谷P1450 [HAOI2008]硬币购物(背包问题,容斥原理)

    洛谷题目传送门 我实在是太弱了,第一次正儿八经写背包DP,第一次领会如此巧妙的容斥原理的应用...... 对每次询问都做一遍多重背包,显然T飞,就不考虑了 关键就在于每次询问如何利用重复的信息 我这么 ...

  3. 洛谷P1450 [HAOI2008]硬币购物

    题目描述 硬币购物一共有4种硬币.面值分别为c1,c2,c3,c4.某人去商店买东西,去了tot次.每次带di枚ci硬币,买si的价值的东西.请问每次有多少种付款方法. 输入输出格式 输入格式: 第一 ...

  4. [Luogu P1450] [HAOI2008]硬币购物 背包DP+容斥

    题面 传送门:https://www.luogu.org/problemnew/show/P1450 Solution 这是一道很有意思的在背包里面做容斥的题目. 首先,我们可以很轻松地想到暴力做背包 ...

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

    考虑如果没有个数的限制,那么就是一个完全背包,所以先跑一个完全背包,求出没有个数限制的方案数即可. 因为有个数的限制,所以容斥一下:没有1个超过限制的方案=至少0个超过限制-至少1个超过限制+至少2个 ...

  6. 【洛谷P1450】硬币购物

    题目大意:给定 4 种面值的硬币和相应的个数,求购买 S 元商品的方案数是多少. 题解: 考虑没有硬币个数的限制的话,购买 S 元商品的方案数是多少,这个问题可以采用完全背包进行预处理. 再考虑容斥, ...

  7. BZOJ1042:[HAOI2008]硬币购物(DP,容斥)

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

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

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

  9. 2021.12.06 P1450 [HAOI2008]硬币购物(组合数学+抽屉原理+DP)

    2021.12.06 P1450 [HAOI2008]硬币购物(组合数学+抽屉原理+DP) https://www.luogu.com.cn/problem/P1450 题意: 共有 44 种硬币.面 ...

随机推荐

  1. Java进阶专题(十三) 从电商系统角度研究多线程(上)

    前言 ​ 本章节主要分享下,多线程并发在电商系统下的应用.主要从以下几个方面深入:线程相关的基础理论和工具.多线程程序下的性能调优和电商场景下多线程的使用. 多线程J·U·C 线程池 概念 回顾线程创 ...

  2. vue3剖析:响应式原理——effect

    响应式原理 源码目录:https://github.com/vuejs/vue-next/tree/master/packages/reactivity 模块 ref: reactive: compu ...

  3. 微信小程序-组件-视图容器

    1.view 1.作用:类似 html 的 div 用来进行页面布局,具有块级盒子特性. 2.常用属性:设置view盒子点击后的状态,以及控制是否影响父盒子的点击状态 3.eg:<view ho ...

  4. 安卓自动化测试工具Monkey简单使用

    一.首先安装adb 地址:http://www.downza.cn/soft/219906.html安装到D盘下,安装的过程中自己注意下不要安装上全家桶.找到这个压缩包:解压到当前文件夹: 二.将ad ...

  5. ctfhub 报错注入

    payload   1 Union select count(*),concat((查询语句),0x26,floor(rand(0)*2))x from information_schema.colu ...

  6. python循环输出

    python 目录 python 1.九九乘法表 2.循环输出数字0-9,数字为六,跳出循环,执行其他循环,数字为八,结束循环 3.使用循环计算0-100素数的和 4.使用for循环输出三角形 1.九 ...

  7. Java虚拟机栈--栈帧

    栈帧的内部结构 每个栈帧中存储着 1.局部变量表(Local Variables) 2.操作数栈(Operand Stack)(或表达式栈) 3.动态链接(Dynamic Linking)(或执行&q ...

  8. doeker部署zabbix

    docker部署zabbix   我相信大家都已经会再物理机上跑zabbix并且监控了,那么有没有想过在docker中跑zabbix?下面咱们来看看如何在docker中搭建zabbix并且监控 部署环 ...

  9. Linux磁盘管理及LVM讲解(1)

    硬盘接口 从整体的角度上,硬盘接口分为IDE.SATA.SCSI和SAS四种,IDE接口硬盘多用于家用产品中,也部分应用于服务器,SCSI接口的硬盘则主要应用于服务器市场,而SAS只在高端服务器上,价 ...

  10. PS01

    基础学习:PS 平面设计:海报 影楼后期:婚纱照精修 UI设计: AI:是矢量图处理软件 矢量图:放大缩小后不会失真 使用方向:包装盒设计,logo设计,名片 ID使用方向:画册