题目描述

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

输入输出格式

输入格式:

第一行 c1,c2,c3,c4,tot 下面tot行 d1,d2,d3,d4,s

输出格式:

每次的方法数

输入输出样例

输入样例#1:

1 2 5 10 2
3 2 3 1 10
1000 2 2 2 900
输出样例#1:

4
27

说明

di,s<=100000

tot<=1000

题解:

一开始认为要求出一个4元方程的解的个数,用容斥求出所有GCD(a,b,c,d)|si的解

但时间复杂度太高,且条件限制不好做。

后面看到一种解法:

用dp求f[i]为钱数为i时的方案总数

显然f[i]=signma(f[i-c[j]])

复杂度为O(4*s)

再用容斥原理求出所有方案,减去1超出限制,再减去2超限,还有3和4。再加上1,2超限.....

i超出限制的方案为f[si-(d[j]+1)*c[j]]

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
long long c[],d[],tot;
long long f[],ans;
int main()
{long long i,j,s;
cin>>c[]>>c[]>>c[]>>c[]>>tot;
f[]=;
for (i=;i<=;i++)
for (j=c[i];j<=;j++)
{
f[j]+=f[j-c[i]];
}
for (i=;i<=tot;i++)
{
for (j=;j<=;j++)
scanf("%I64d",&d[j]);
scanf("%I64d",&s);
ans=f[s];
if ((d[]+)*c[]<=s)
ans-=f[s-(d[]+)*c[]];
if ((d[]+)*c[]<=s)
ans-=f[s-(d[]+)*c[]];
if ((d[]+)*c[]<=s)
ans-=f[s-(d[]+)*c[]];
if ((d[]+)*c[]<=s)
ans-=f[s-(d[]+)*c[]]; if ((d[]+)*c[]+(d[]+)*c[]<=s)
ans+=f[s-(d[]+)*c[]-(d[]+)*c[]];
if ((d[]+)*c[]+(d[]+)*c[]<=s)
ans+=f[s-(d[]+)*c[]-(d[]+)*c[]];
if ((d[]+)*c[]+(d[]+)*c[]<=s)
ans+=f[s-(d[]+)*c[]-(d[]+)*c[]];
if ((d[]+)*c[]+(d[]+)*c[]<=s)
ans+=f[s-(d[]+)*c[]-(d[]+)*c[]];
if ((d[]+)*c[]+(d[]+)*c[]<=s)
ans+=f[s-(d[]+)*c[]-(d[]+)*c[]];
if ((d[]+)*c[]+(d[]+)*c[]<=s)
ans+=f[s-(d[]+)*c[]-(d[]+)*c[]]; if ((d[]+)*c[]+(d[]+)*c[]+(d[]+)*c[]<=s)
ans-=f[s-(d[]+)*c[]-(d[]+)*c[]-(d[]+)*c[]];
if ((d[]+)*c[]+(d[]+)*c[]+(d[]+)*c[]<=s)
ans-=f[s-(d[]+)*c[]-(d[]+)*c[]-(d[]+)*c[]];
if ((d[]+)*c[]+(d[]+)*c[]+(d[]+)*c[]<=s)
ans-=f[s-(d[]+)*c[]-(d[]+)*c[]-(d[]+)*c[]];
if ((d[]+)*c[]+(d[]+)*c[]+(d[]+)*c[]<=s)
ans-=f[s-(d[]+)*c[]-(d[]+)*c[]-(d[]+)*c[]]; if ((d[]+)*c[]+(d[]+)*c[]+(d[]+)*c[]+(d[]+)*d[]<=s)
ans+=f[s-(d[]+)*c[]-(d[]+)*c[]-(d[]+)*c[]-(d[]+)*d[]];
cout<<ans<<endl;
}
}

[HAOI2008]硬币购物的更多相关文章

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

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

  2. bzoj 1042: [HAOI2008]硬币购物 dp+容斥原理

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

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

    BZOJ_1042_[HAOI2008]硬币购物_容斥原理+背包 题意: 硬币购物一共有4种硬币.面值分别为c1,c2,c3,c4.某人去商店买东西,去了tot次.每次带di枚ci硬币,买s i的价值 ...

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

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

  7. 【BZOJ】1042: [HAOI2008]硬币购物

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

  8. BZOJ1042 [HAOI2008]硬币购物 【完全背包 + 容斥】

    1042: [HAOI2008]硬币购物 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 2924  Solved: 1802 [Submit][St ...

  9. 【BZOJ1042】[HAOI2008]硬币购物 容斥

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

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

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

随机推荐

  1. Beta冲刺NO.5

    Beta冲刺 第五天 1. 昨天的困难 1.昨天的困难主要是在类的整理上,一些逻辑理不清,也有一些类写的太绝对了,扩展性就不那么好了,所以,昨天的困难就是在重构上. 页面结构太凌乱,之前没有统筹好具体 ...

  2. pymysql 多字段插入

    d = {'name':'alx','age':18,'pp':11,'cc':12} sql = '''insert into xx(%s) value(%s)''' key_list = [] v ...

  3. 2017北京国庆刷题Day4 morning

    期望得分:0+40+30=70 实际得分:0+10+10=20 题目修改:只能由0变1,只能用一次操作 大模拟 #include<cstdio> #include<cstring&g ...

  4. php_类的定义

    此文章为原创见解,例子各方面也是东拼西凑.如果有错请留言.谢谢 在面向对象的思维中提出了两个概念,类和对象. 类是对某一类实物的抽象描述,而对象用于表示现实中该类事物的个体, 例子:老虎是父类,东北虎 ...

  5. NoSQL简介

    相信大家也多多少少了解过一些数据库,最常用的当属MySQL了,当然也这是关系型数据库的代表了 常见的关系型数据库有:MySQL.SQLServer.Oracle 而数据库也有另一个流派-----NoS ...

  6. vue组件详解(二)——使用props传递数据

    在 Vue 中,父子组件的关系可以总结为 props向下传递,事件向上传递.父组件通过 props 给子组件下发数据,子组件通过事件给父组件发送消息.看看它们是怎么工作的.  一.基本用法 组件不仅仅 ...

  7. android studio 何如修改报名

    1. 重命名办法,网上很多见 2. 对于需要重新修改包名的级别的 a. 修改package 和 gradle 的包名,对应一致. b. 修改R 所在包名,使用crtl+n修改R文件的路径 c. 手动首 ...

  8. MySQL/上

    MySQL操作/上 一.视图 视图表是一个虚拟表(非真实存在),其本质是[根据sql语句获取动态的数据集,并为其命名],用户使用表只需使用(名称)即可获取结果集,并可以将其当做表来使用. 1.创建视图 ...

  9. ZOJ-1203 Swordfish---最小生成树

    题目链接: https://vjudge.net/problem/ZOJ-1203 题目大意: 给定平面上N个城市的位置,计算连接这N个城市所需线路长度总和的最小值. 思路: 模板题 最小生成树,Pr ...

  10. jacascript 立即执行函数(IIFE)与闭包

    前言:这是笔者学习之后自己的理解与整理.如果有错误或者疑问的地方,请大家指正,我会持续更新! 一直没搞清楚立即执行函数和闭包之间的关系,总结一下: 闭包有很多种理解:访问不到内部作用域,函数就是这样, ...