这题常规套路根本用不上

一共就四枚硬币,所以要考虑对硬币的算法

然而谁能想到容斥啊。。。

首先查询是很多的,需要对每个查询做到尽量常数级

首先排除dp查询,因为状态肯定不支持O(1)查询

然后需要想到容斥,,差分出合法区间。。。

所有方案(完全背包) - 一定超出的方案=答案

注:

注意特判f里面的数的大小,如果==0,则是1 (一个也不选是一种)  ,如果小于0,则是0(无论如何加不出来)

码:

#include<iostream>
#include<cstdio>
using namespace std;
#define ll long long
ll f[100005],ans;
int c[5],d[5],i,j,tot,s;
int main()
{scanf("%d%d%d%d%d",&c[1],&c[2],&c[3],&c[4],&tot);f[0]=1;for(i=1;i<=4;i++)for(j=c[i];j<=100000;j++)f[j]+=f[j-c[i]];for(i=1;i<=tot;i++){scanf("%d%d%d%d%d",&d[1],&d[2],&d[3],&d[4],&s);ans=f[s];if(s-(c[1]*(d[1]+1))>=0)ans-=f[s-(c[1]*(d[1]+1))];if(s-(c[2]*(d[2]+1))>=0)ans-=f[s-c[2]*(d[2]+1)];if(s-(c[3]*(d[3]+1))>=0)ans-=f[s-c[3]*(d[3]+1)];if(s-(c[4]*(d[4]+1))>=0)ans-=f[s-c[4]*(d[4]+1)];if(s-c[1]*(d[1]+1)-c[2]*(d[2]+1)>=0)ans+=f[s-c[1]*(d[1]+1)-c[2]*(d[2]+1)];if(s-c[3]*(d[3]+1)-c[2]*(d[2]+1)>=0)ans+=f[s-c[3]*(d[3]+1)-c[2]*(d[2]+1)];if(s-c[4]*(d[4]+1)-c[2]*(d[2]+1)>=0)ans+=f[s-c[4]*(d[4]+1)-c[2]*(d[2]+1)];if(s-c[1]*(d[1]+1)-c[3]*(d[3]+1)>=0)ans+=f[s-c[1]*(d[1]+1)-c[3]*(d[3]+1)];if(s-c[1]*(d[1]+1)-c[4]*(d[4]+1)>=0)ans+=f[s-c[1]*(d[1]+1)-c[4]*(d[4]+1)];if(s-c[3]*(d[3]+1)-c[4]*(d[4]+1)>=0)ans+=f[s-c[3]*(d[3]+1)-c[4]*(d[4]+1)];if(s-c[1]*(d[1]+1)-c[3]*(d[3]+1)-c[2]*(d[2]+1)>=0)ans-=f[s-c[1]*(d[1]+1)-c[3]*(d[3]+1)-c[2]*(d[2]+1)];if(s-c[1]*(d[1]+1)-c[3]*(d[3]+1)-c[4]*(d[4]+1)>=0)ans-=f[s-c[1]*(d[1]+1)-c[3]*(d[3]+1)-c[4]*(d[4]+1)];if(s-c[1]*(d[1]+1)-c[2]*(d[2]+1)-c[4]*(d[4]+1)>=0)ans-=f[s-c[1]*(d[1]+1)-c[2]*(d[2]+1)-c[4]*(d[4]+1)];if(s-c[4]*(d[4]+1)-c[3]*(d[3]+1)-c[2]*(d[2]+1)>=0)ans-=f[s-c[4]*(d[4]+1)-c[3]*(d[3]+1)-c[2]*(d[2]+1)]; if(s-c[1]*(d[1]+1)-c[3]*(d[3]+1)-c[2]*(d[2]+1)-c[4]*(d[4]+1)>=0) ans+=f[s-c[1]*(d[1]+1)-c[3]*(d[3]+1)-c[2]*(d[2]+1)-c[4]*(d[4]+1)];printf("%lld\n",ans);}
}

2017.10.23 硬币购物 失败总结相关推荐

  1. 2017.10.23 卡牌游戏 失败总结

    dp好难啊.. 这个题主要是离散点找不准,但其实也就这样 1.尝试状态压缩,状态爆炸 2.状态里面1很多,尝试统计1的个数 3.枚举起点 但这样做还是没法做,因为没有终点 所以就再枚举一层终点.. 就 ...

  2. 2017.10.23解题报告

    预计分数:100+60+0=160 实际分数:100+80+0=180 T1 题目描述 现在有一个字符串,每个字母出现的次数均为偶数.接下来我们把第一次出现的字母a和第二次出现的a连一条线,第三次出现 ...

  3. 2017.10.23 模拟考试 (题目来自:学大伟业)

    T1 叉叉 题目描述 现在有一个字符串,每个字母出现的次数均为偶数.接下来我们把第一次出现的字母a和第二次出现的a连一条线,第三次出现的和四次出现的字母a连一条线,第五次出现的和六次出现的字母a连一条 ...

  4. 2017.10.23 chess 中国象棋 思考记录

    这种题的一般解法: 1. 发现状压可以搞,然后发现状态爆炸 2.考虑状态特点,一共只有几种可能的状态 3.考虑可不可以只对状态进行计数 4.离散统计贡献 码: #include<iostream ...

  5. 2017.10.22 方格染色 失败总结

    详细题解网上有好多.. 一开始想用一个并查集维护  确定关系 一个并查集维护相等关系 但会出现一些无解判不出来(原因未知) 所以就只能写加权并查集,记录每个点和他根节点的相等关系:0相等 1不等 然后 ...

  6. 2017.10.15 旅行comf 失败总结

    越是取值要求奇怪的题,范围不大的题,就越需要枚举. 这个比值的要求非常特殊,他没有任何最优值可以取,所以不能考虑dp及其相似算法 所以就要考虑枚举一个求另一个,易知枚举了最小的,加的必须是比他大的,所 ...

  7. 2017.10.13 硬币游戏 思考记录

    这个题用特征法可以比较好的找到思路 首先这个题有两个特征:1.正+反=反   反+正=反  正+正=正  反+反=正   应该能很快想到亦或 2.范围1e5  +  上限2^60   应该能很快想到倍 ...

  8. 2017.10.12 礼物(zjoi2011) 失败总结

    听说n^4能过,于是愉快地敲了n^4  ,还带了两个最优性剪枝.. 结果事实证明是别人家的n^4...(wys?) 很奇怪玄学剪枝有时2^50次方都能过,为什么这个连1e10都过不了... TLE代码 ...

  9. 2017.10.11 Problem c 失败总结

    一开始就想偏了.. 首先计数题 30s + n<=300显然是让你n^3 dp的 先从手玩开始考虑 注意到从大到小出现的数字个数是可以判断有无解的 ,,然后可以画出一些区间的条件  如(> ...

最新文章

  1. 影像组学视频学习笔记(43)-标准差、标准误及95%置信区间CI、Li‘s have a solution and plan.
  2. 长按不响应_长周期物料的预测:需求预测的一大难点
  3. 机器学习中导数最优化方法(基础篇)
  4. 国际计算机语言,国际标准的5种PLC编程语言简介
  5. 简单使用Modelsim跑个仿真
  6. ot协议是什么_OT的完整形式是什么?
  7. 浪漫桃心的Android表白程序
  8. python--过滤top命令--之--时间_系统CPU_进程CPU_内存
  9. iPhone之UITextField缩进文本
  10. 【ASP.NET 基础】ASP.NET 目录操作
  11. MySQL 修改字段类型或长度
  12. matlab画三原色品图,怎么为色品图填充颜色,Error using == TriScatteredInterp
  13. 江苏计算机编程中小学,编程教育走进小学低年级
  14. 记录建行外联平台退款操作
  15. 计算机技术前沿知识,计算机前沿知识讲座心得.doc
  16. 3.25万颗!真正前装上车的激光雷达供应商有哪几家?
  17. selenium:表单frame切换和句柄窗口切换
  18. 「题解」NOIP模拟测试题解乱写II(36)
  19. 识人、识货、识场—— 这就是智能零售该有的样子
  20. Libra最后的命运

热门文章

  1. LeetCode-118杨辉三角C++详解
  2. PDE抛物型方程数值解法总结与例题分析
  3. SQL Server IN语句使用举例
  4. pagehelper工具类_PageHelper最佳实践
  5. @configurationproperties注解的使用_徒手使用SpringBoot自定义Starter启动器
  6. python对excel数据更改_利用python对excel中一列的时间数据更改格式代码示例
  7. java中字符数组和字符串的相互转换
  8. EDGE浏览器配合阿呆喵设置广告过滤
  9. mysql数据库查询源码_超简单php mysql数据库查询类
  10. Python练习:恺撒密码 I