博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Bzoj1042: [HAOI2008]硬币购物
阅读量:6147 次
发布时间:2019-06-21

本文共 1361 字,大约阅读时间需要 4 分钟。

题面

Sol

容斥原理+背包

处理出所有金币无限制条件凑成\(j\)元的方案数
考虑计算
\(c\)只有\(4\)种,可以容斥一波
就是无限制的总方案-\(1\)个硬币超出限制的方案+\(2\)个的-\(3\)个的+\(4\)个的

# include 
# define RG register# define IL inline# define Fill(a, b) memset(a, b, sizeof(a))using namespace std;typedef long long ll;const int _(1005);IL int Input(){ RG int x = 0, z = 1; RG char c = getchar(); for(; c < '0' || c > '9'; c = getchar()) z = c == '-' ? -1 : 1; for(; c >= '0' && c <= '9'; c = getchar()) x = (x << 1) + (x << 3) + (c ^ 48); return x * z;}typedef int Arr[_];int c[4], tot, mx, pw[4] = {1, 2, 4, 8}, s[_], d[4][_];ll f[_ * 100] = {1}, ans;int main(RG int argc, RG char *argv[]){ for(RG int i = 0; i < 4; ++i) c[i] = Input(); tot = Input(); for(RG int i = 1; i <= tot; ++i){ for(RG int j = 0; j < 4; ++j) d[j][i] = (Input() + 1) * c[j]; s[i] = Input(), mx = max(mx, s[i]); } for(RG int i = 0; i < 4; ++i) for(RG int j = c[i]; j <= mx; ++j) f[j] += f[j - c[i]]; for(RG int i = 1; i <= tot; ++i){ ans = 0; for(RG int j = 0; j < 16; ++j){ RG int op = 1, sum = 0; for(RG int k = 0; k < 4; ++k) if(j & pw[k]) op = -op, sum += d[k][i]; ans += (sum > s[i]) ? 0 : (1LL * op * f[s[i] - sum]); } printf("%lld\n", ans); } return 0;}

转载于:https://www.cnblogs.com/cjoieryl/p/8660020.html

你可能感兴趣的文章
除以2
查看>>
高可用集群原理解析
查看>>
Nginx配置URL转向tomcat
查看>>
极客Web前端开发资源大荟萃#001
查看>>
让div固定在某个位置
查看>>
Java开发环境Docker镜像
查看>>
从无到有,WebService Apache Axis2初步实践
查看>>
任务调度(一)——jdk自带的Timer
查看>>
UIKit框架(15)PCH头文件
查看>>
整理看到的好的文档
查看>>
Linux磁盘管理和文件系统管理
查看>>
linux运维人员的成功面试总结案例分享
查看>>
Windows DHCP Server基于MAC地址过滤客户端请求实现IP地址的分配
查看>>
命令查询每个文件文件数
查看>>
《跟阿铭学Linux》第8章 文档的压缩与打包:课后习题与答案
查看>>
RAC表决磁盘管理和维护
查看>>
Apache通过mod_php5支持PHP
查看>>
发布一个TCP 吞吐性能测试小工具
查看>>
java学习:jdbc连接示例
查看>>
PHP执行批量mysql语句
查看>>