洛谷 P1450 [HAOI2008] 硬币购物

思路

完全背包:预处理出不限制硬币数量的方案数。

dp[0]=1;
dfor(i,1,4) dfor(j,c[i],(int)1e5) dp[j]+=dp[j-c[i]];

容斥

  • 不限制数量的方案数 − - 超出限制的方案数 = 符合限制的方案数 。考虑第 i i i 种硬币超出数量限制的方案数。强制支付 d i + 1 d_i+1 di+1 i i i 种硬币,价值为 c i ∗ ( d i + 1 ) c_i*(d_i+1) ci(di+1) ,此时再支付硬币 i i i 一定是超出限制的。得:超出硬币 i i i 限制的价值为 s − c i ∗ ( d i + 1 ) s-c_i*(d_i+1) sci(di+1) ,方案数为 d p [ s − c i ∗ ( d i + 1 ) ] dp[s-c_i*(d_i+1)] dp[sci(di+1)]
  • 上述得出超出硬币 i i i 价值为 s − c i ∗ ( d i + 1 ) s-c_i*(d_i+1) sci(di+1) ,这只是一种硬币的情况,如果不止一种硬币,你无法保证价值 s − c i ∗ ( d i + 1 ) s-c_i*(d_i+1) sci(di+1) 中是否包含了硬币 j j j 的符合限制的价值,也就是说 d p [ s − c i ∗ ( d i + 1 ) ] dp[s-c_i*(d_i+1)] dp[sci(di+1)] 中有硬币 j j j 符合限制的方案数。
  • 硬币 i i i 超出限制集合表示为 A i A_i Ai ,硬币 j j j 超出限制集合表示为 A j A_j Aj A i ∪ A j = A i + A j − A i ∩ A j A_i\cup A_j=A_i+A_j-A_i\cap A_j AiAj=Ai+AjAiAj不多说奇加偶减 。不限制集合设为 S S S,答案集合 a n s = S − ( A i ∪ A j ∪ … ) ans=S-(A_i\cup A_j\cup \ldots) ans=S(AiAj)

二进制

  • 用每一位表示一种硬币, 1 1 1 那一位存在硬币, 0 0 0 反之。如 0101 0101 0101 表示第 3 3 3 种硬币和第 1 1 1 种的并集。
dfor(i,1,15)
{re int cnt=0,sum=0;dfor(j,0,3)if(i&(1<<j)) ++cnt,sum+=c[j+1]*(d[j+1]+1);int f=cnt&1?-1:1;if(s>=sum) ans+=f*dp[s-sum];
}

Think Twice, Code Once

#include<bits/stdc++.h>
#define il inline
#define get getchar
#define put putchar
#define is isdigit
#define re register
#define int long long
#define dfor(i,a,b) for(re int i=a;i<=b;++i)
#define dforr(i,a,b) for(re int i=a;i>=b;--i)
#define dforn(i,a,b) for(re int i=a;i<=b;++i,put(10))
#define mem(a,b) memset(a,b,sizeof a)
#define memc(a,b) memcpy(a,b,sizeof a)
#define pr 114514191981
#define gg(a) cout<<a,put(32)
#define INF 0x7fffffff
#define tt(x) cout<<x<<'\n'
#define ls i<<1
#define rs i<<1|1
#define la(r) tr[r].ch[0]
#define ra(r) tr[r].ch[1]
#define lowbit(x) (x&-x)
using namespace std;
typedef unsigned int ull;
int read(void)
{re int x=0,f=1;re char c=get();while(!is(c)) (f=c==45?-1:1),c=get();while(is(c)) x=(x<<1)+(x<<3)+(c^48),c=get();return x*f;
}
void write(int x)
{if(x<0) x=-x,put(45);if(x>9) write(x/10);put((x%10)^48);
}
#define writeln(a) write(a),put(10)
#define writesp(a) write(a),put(32)
#define writessp(a) put(32),write(a)
const int N=1e5+10,M=3e4+10,SN=1e4+10,mod=998244353;
int n,s,c[5],d[5],dp[N];
signed main()
{dfor(i,1,4) c[i]=read();n=read();dp[0]=1;dfor(i,1,4) dfor(j,c[i],(int)1e5) dp[j]+=dp[j-c[i]];while(n--){dfor(i,1,4) d[i]=read();s=read();re int ans=dp[s];dfor(i,1,15){re int cnt=0,sum=0;dfor(j,0,3)if(i&(1<<j)) ++cnt,sum+=c[j+1]*(d[j+1]+1);int f=cnt&1?-1:1;if(s>=sum) ans+=f*dp[s-sum];}writeln(ans);}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/193031.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu18.04的VSCode输入不了中文

在Ubuntu使用VSCode写代码想写注释的&#xff0c;但是发现不能输入中文&#xff0c;上网寻找解决方案&#xff0c;这个方法也是可以的&#xff08;根据2的命令操作就可以了&#xff0c;2也使参考1的&#xff09;&#xff1a; Visual Studio Code on Linux-Debian and Ubuntu b…

【数电笔记】18-卡诺图化简

目录 说明&#xff1a; 用卡诺图化简逻辑函数 1. 公式法化简与卡诺图化简对比 2. 化简依据 3. 化简规律 3.1 两个小方块相邻 3.2 四个小方块相邻 3.3 八个小方块相邻 4. 卡诺图化简法步骤 4.1 例1 4.2 例2 5. 画卡诺圈规则 5.1 例1 6. 特殊情况 6.1 例1 6.2 例…

【JVM】一篇通关JVM类加载与字节码技术

目录 1. 类文件结构1-1. 魔数 版本 常量池 2. 字节码指令3. 编译期处理4. 类加载阶段5. 类加载器6. 运行期优化 类加载与字节码技术 1. 类文件结构 案例 // HelloWorld 示例 public class HelloWorld {public static void main(String[] args) {System.out.println("h…

职责链模式-C++实现

职责链模式是一种行为型设计模式&#xff0c;它允许多个对象以链式的方式处理请求&#xff0c;避免了请求的发送者和接收者之间的耦合关系。将这些对象连成一条链&#xff0c;并沿着这条链传递请求&#xff0c;直到有一个对象处理请求为止&#xff0c;也就是说如果当前对象不处…

[Linux] linux防火墙

一、防火墙是什么 防火墙&#xff08;FireWall&#xff09;&#xff1a;隔离功能&#xff0c;工作在网络或主机的边缘&#xff0c;数据包的匹配规则与由一组功能定义的操作组件处理的规则相匹配&#xff0c;根据特定规则检查网络或主机的入口和出口 当要这样做时&#xff0c;基…

shell编程-sed命令详解(超详细)

文章目录 前言一、sed命令介绍1. sed命令简介2. sed命令的基本语法3. 常用的sed命令选项&#xff1a;4. 常用的sed编辑命令&#xff1a; 二、sed命令示例用法1. 替换文本2. 删除匹配行&#xff1a;3. 打印特定行&#xff1a;4. 在指定行之前插入文本&#xff1a;5. 从文件中读取…

springboot(ssm stone音乐播放器 在线音乐平台Java(codeLW)

springboot(ssm stone音乐播放器 在线音乐平台Java(code&LW) 开发语言&#xff1a;Java 框架&#xff1a;ssm/springboot vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&#xff1a;mysql 5.7&#xff08;或8.0&#x…

C++函数模板,类模板

C函数模板&#xff0c;类模板 1.函数模板1.1函数模板的概念1.2函数模板的格式1.3函数模板的原理1.4函数模板的实例化1.5模板参数的匹配原则 2.类模板2.1类模板的定义格式2.2类模板的实例化 1.函数模板 1.1函数模板的概念 在C中&#xff0c;函数模板是一种通用的函数定义&…

Mybatis缓存机制

系列文章目录 1、mybatis简介及数据库连接池 2、mybatis简单使用 3、mybatis中selectOne的使用 4、mybatis中resultMap结果集的使用 5、mybatis实用教程之XML实现动态sql 6、Mybatis使用注解实现复杂动态SQL Mybatis缓存机制 系列文章目录前言1、配置二级缓存2、使用场景&…

Linux系统-----进程通讯

前言 本期我们来学习进程间的通讯 一、信号机制 1、信号的基本概念 每个信号都对应一个正整数常量(称为signal number,即信号编号。定义在系统头文件<signal.h>中)&#xff0c;代表同一用户的诸进程之间传送事先约定的信息的类型&#xff0c;用于通知某进程发生了某异常…

Java 使用对应arthas 调试程序

1、作用 使用 arthas 可以进行如下操作 ① 抓取对应函数的耗时结构&#xff0c;然后分析对应的代码优化代码 ② 抓取对应函数的 入参、出参函数 ③ 重放对应的函数执行 ④ 查询对应程序占用结构&#xff0c;比如 cpu, jvm ⑤ 查询对应的 执行最频繁的 线程 ⑥ 打印函数…

开源软件license介绍与检测

开源License介绍 通俗来讲&#xff0c;开源许可证就是一种允许软件使用者在一定条件内按照需要自由使用和修改软件及其源代码的的法律条款。借此条款&#xff0c;软件作者可以将这些权利许可给使用者&#xff0c;并告知使用限制。这些许可条款可以由个人、商业公司或非赢利组织…

华为攻击防范简介

定义 攻击防范是一种重要的网络安全特性。它通过分析上送CPU处理的报文的内容和行为&#xff0c;判断报文是否具有攻击特性&#xff0c;并配置对具有攻击特性的报文执行一定的防范措施。 攻击防范主要分为畸形报文攻击防范、分片报文攻击防范和泛洪攻击防范。 目的 目前&…

Opencv框选黑色字体进行替换(涉及知识点:selectROI,在控制台输入字体大小,颜色,内容替换所选择的区域)

import cv2 from PIL import Image,ImageDraw,ImageFont import numpy as npimg_path ../img/ img_clean_path ../img_clean/ name xiao_ben suf .pngimg cv2.imread(img_pathnamesuf) cv2.imshow(original, img)# 选择ROI roi cv2.selectROI(windowName"original&q…

SpringAMQP入门案例——接收消息

依赖 <!--SpringAMQP起步依赖--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId> </dependency> yml配置文件 自行修改 spring:rabbitmq:host: 192.168.220.130 # …

团队怎么高效制作问卷?

制作调查问卷时并不是一个人就能单独完成&#xff0c;通常情况下&#xff0c;完成一份调查问卷往往需要一个团队的成员参与&#xff0c;相互协作&#xff0c;共同完成。不过&#xff0c;多人协作经常会遇到协作壁垒&#xff0c;导致效率低下&#xff0c;那团队怎么才能高效协作…

IntelliJ IDEA 之初体验(上)

IntelliJ IDEA 是一款由 JetBrains 公司开发的强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;专注于 Java 开发&#xff0c;同时支持多种其他编程语言。本文将详细介绍 IntelliJ IDEA 的安装过程以及一些常用的基本操作。 第一步&#xff1a;下载与安装 IntelliJ…

C/C++,树算法——Ukkonen的“后缀树“构造算法的源程序

1 文本格式 // A C program to implement Ukkonens Suffix Tree Construction // And then build generalized suffix tree #include <stdio.h> #include <string.h> #include <stdlib.h> #define MAX_CHAR 256 struct SuffixTreeNode { struct Suffix…

vue3 Hooks函数使用及常用utils封装

hooks 是什么 vue3使用了composition API&#xff0c;我们可自定义封装hooks&#xff0c;达到复用&#xff0c;在Vue2中采取的mixins&#xff0c;对mixins而言&#xff0c; hooks更清楚复用功能代码的来源, 更清晰易懂。 简单来说&#xff1a;hooks 就是函数的一种写法&#xf…

把大模型塞进终端,能让消费电子市场回暖吗?

过去几个月时间里&#xff0c;“把大模型塞进终端”已然成了消费电子产业上下游心照不宣的共识。 高通、AMD、英特尔等上游的芯片厂商&#xff0c;争相喊出了混合AI、终端AI、AI计算等概念&#xff0c;努力向外界讲述终端AI化的想象空间&#xff1b;华为、小米、vivo等手机厂商…