题目描述

硬币购物一共有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. Angular-ui-router+ocLazyLoad.js应用实例

    AngularJS诞生于2009年,由Misko Hevery 等人创建,后为Goole所收购.是一款优秀的前端JS框架.AngularJS有着诸多特性,最为核心的是:MVC,撗块化,自动化双向数据绑 ...

  2. EasyUI导航栏。

    html: <div data-options="region:'west',split:true" title="导航栏菜单" style=" ...

  3. javascript中的数组对象

    1.创建数组的三种方式: 1.1 var 数组名=[元素1,元素2,元素3...]; 例如: var arr1=[1,2,3,4]; 1.2 var 数组名=new Array(元素1,元素2,元素3 ...

  4. Linux的rsync 配置,用于服务器之间远程传大量的数据

    [教程主题]:rsync [课程录制]: 创E [主要内容] [1] rsync介绍 Rsync(Remote Synchronize) 是一个远程资料同步工具,可通过LAN/WAN快速同步多台主机, ...

  5. docker安装+测试环境的搭建---

    漏洞演练环境docker地址:http://vulhub.org/#/environments/ 环境:kali-linux-2017.2-amd64.iso 一.docker安装 1.先更新一波源: ...

  6. Java设计模式(七)Decorate装饰器模式

    一.场景描述 (一)问题 系统中最初使用Crystal Report(水晶报表)工具生成报表,并将报表发送给客户端查看,此时定义一CrystalReport工具类即可完成水晶报表的生成工作. 后续报表 ...

  7. NHibernate优点和缺点:

    NHibernate优点: 1.完全的ORM框架. NHibernate对数据库结构提供了较为完整的封装,它将数据库模式映射为较完全的对象模型,支持封装,继续机制,功能较强大,比一般的ORM灵活性高. ...

  8. C++中构造函数的初始化列表(const、引用&变量初始化)

    1. 构造函数执行分为两个阶段: a.初始化阶段(初始化) 初始化阶段具体指的是用构造函数初始化列表方式来初始化类中的数据成员. ClassXX:val(a),key(b){}; b.普通计算阶段(赋 ...

  9. __new__ 单例

    a.实例化类 实例化一个类时 1. 创建一个对象,调用__new__方法,如果没有会调用父类的__new__方法 2. 调用__init__方法 3. 返回对象的引用 class Dog(object ...

  10. AOV网络和Kahn算法拓扑排序

    1.AOV与DAG 活动网络可以用来描述生产计划.施工过程.生产流程.程序流程等工程中各子工程的安排问题.   一般一个工程可以分成若干个子工程,这些子工程称为活动(Activity).完成了这些活动 ...