题目描述 Description###

硬币购物一共有4种硬币。面值分别为\(c_1\) ,\(c_2\) ,\(c_3\) ,\(c_4\) 。某人去商店买东西,去了\(tot\) 次。每次带\(d_i\) 枚\(c_i\) 硬币,买\(s_i\) 的价值的东西。请问每次有多少种付款方法。

输入描述 Input Description###

第一行 \(c_1\) ,\(c_2\) ,\(c_3\) ,\(c_4\) ,\(tot\) 下面\(tot\) 行 \(d_1\) ,\(d_2\) ,\(d_3\) ,\(d_4\) ,\(s\) ,

输出描述 Output Description###

每次的方法数

样例输入 Sample Input###

1 2 5 10 2
3 2 3 1 10
1000 2 2 2 900

样例输出 Sample Output###

4
27

数据范围及提示 Data Size & Hint###

其中\(d_i,s<=100000,tot<=1000\)

之前的一些废话###

退役的我回归了,但这次重返只是为了明天的比赛,时间虽短,但重新拾起这一切的我找到了5个月前为了梦想奋斗的自己,当时的自己热血沸腾,充满斗志,说真的,我无比热爱这种感觉,但这毕竟只是昙花一现,转瞬即逝的。

题解###

背包问题带有这么多附属条件,还有数量限制,看起来好复杂啊。(谁叫我几个月没有碰OI,大脑生锈了呢)

但是如果不考虑数量限制,这就是一个很智障的背包问题了(md第一次打我循环顺序还打反了)

\(f_i\)表示不考虑任何限制,由四种硬币组成价值为i的方案数,转移为:$f[i]=\sum {f_{i-c_j}} (j \leq 4) $

显然这并不是最后的答案,因为这些方案里还藏着不少几类硬币超限的方案,于是我们需要用容斥原理把他们减掉

ans=\(f_s\) -(只有第一类硬币超的方案)--(只有第二类硬币超的方案)-(只有第三类硬币超的方案)-(只有第四类硬币超的方案)+(只有第一类第二类硬币超的方案)+..+

反正就是这四个集合的交加加减减

现在考虑如何算(只有第一类硬币超的方案)。当第一类硬币去到\(d_1+1\) 时那么一定就超了,剩下的空间就可以随便分配了,所以这个方案数$ =f_{s-c_1*(d_1+1)}$

其他的都类似。

代码###

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<queue>
#include<cstdlib>
using namespace std;
typedef long long LL;
#define mem(a,b) memset(a,b,sizeof(a))
typedef pair<int,int> PII;
#define X first
#define Y second
inline int read()
{
int x=0,f=1;char c=getchar();
while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
while(isdigit(c)){x=x*10+c-'0';c=getchar();}
return x*f;
}
const int maxn=5;
int c[maxn],d[maxn];
LL dp[100010];
int main()
{
for(int i=0;i<4;i++)c[i]=read();
dp[0]=1ll;
for(int i=0;i<4;i++)
for(int j=c[i];j<=100000;j++)dp[j]+=dp[j-c[i]];
//for(int i=0;i<=10;i++)printf("DP:%d %d\n",i,dp[i]);
//cout<<"fa"<<dp[100000]<<endl;
int T=read();
while(T--)
{
for(int i=0;i<4;i++)d[i]=read();
int s=read();
LL ans=0;
for(int i=0;i<16;i++)
{
int cnt=0;
LL tmp=0;
for(int j=0;j<4;j++)
if(i&(1<<j))cnt++,tmp+=(LL)c[j]*(LL)(d[j]+1);
if(tmp>s)continue;
if(cnt%2)ans-=dp[s-tmp];
else ans+=dp[s-tmp];
}
printf("%lld\n",ans);
}
return 0;
}

总结###

大脑不再那么锈了

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

  1. 【BZOJ1042】硬币购物(动态规划,容斥原理)

    [BZOJ1042]硬币购物(动态规划,容斥原理) 题面 BZOJ Description 硬币购物一共有4种硬币.面值分别为c1,c2,c3,c4.某人去商店买东西,去了tot次.每次带di枚ci硬 ...

  2. BZOJ1042 [HAOI2008]硬币购物 完全背包 容斥原理

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1042 题目概括 硬币购物一共有4种硬币.面值分别为c1,c2,c3,c4.某人去商店买东西,去了t ...

  3. [bzoj1042][HAOI2008][硬币购物] (容斥原理+递推)

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

  4. 【BZOJ-1042】硬币购物 容斥原理 + 完全背包

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

  5. bzoj1042: [HAOI2008]硬币购物

    #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #i ...

  6. BZOJ1042:[HAOI2008]硬币购物(DP,容斥)

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

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

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

  8. BZOJ-1042:硬币购物(背包+容斥)

    题意:硬币购物一共有4种硬币.面值分别为c1,c2,c3,c4.某人去商店买东西,去了tot次.每次带di枚ci硬币,买si的价值的东西.请问每次有多少种付款方法. 思路:这么老的题,居然今天才做到. ...

  9. BZOJ1042 HAOI2008硬币购物(任意模数NTT+多项式求逆+生成函数/容斥原理+动态规划)

    第一眼生成函数.四个等比数列形式的多项式相乘,可以化成四个分式.其中分母部分是固定的,可以多项式求逆预处理出来.而分子部分由于项数很少,询问时2^4算一下贡献就好了.这个思路比较直观.只是常数巨大,以 ...

随机推荐

  1. Docker Compose部署GitLab服务,搭建自己的代码托管平台(图文教程)

    场景 Docker-Compose简介与Ubuntu Server 上安装Compose: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/deta ...

  2. Git 在同一台机器上配置多个Git帐号

    在同一台机器上配置多个Git帐号 By:授客 QQ:1033553122 实践环境 win10 Git-2.21.0-64-bit.exe TortoiseGit-2.8.0.0-64bit.msi ...

  3. 前端开发规范:4-JS

    ESLint 使用ESLint的standard规范来编写js代码 更多参考: https://github.com/standard/standard/blob/master/docs/README ...

  4. Linux中crontab定时任务

    crontab安装(centOS) yum -y install vixie-cron crontab语法(计划任务) crontab [-u user] file crontab [-u user] ...

  5. web项目的初始搭建和intellij的tomcat的配置

    点击web application

  6. linux添加磁盘分区做为swap分区

    在部署oracle时,根据内存的不同,会对swap分区大小有不同要求,具体参考https://www.cnblogs.com/chxmtl/p/11672053.html 下面为具体操作步骤. 1.新 ...

  7. 表单生成器(Form Builder)之mongodb表单数据查询——关联查询

    这一篇接着记录一下查询相关的操作.想象一下,如果想要在一张表格中展示某些车辆的耗损和营收情况,我们该怎么处理.车辆.耗损.营收各自存储在一张表中,耗损和营收中冗余了车辆信息……我们便想到了关联查询.m ...

  8. Docker 运行应用程序

    一.docker run 镜像 执行的命令 docker run组合来运行一个容器:镜像文件不存在的话,会自动拉取(下载): 下图执行的命令的具体意思:docker 以ubuntu:15.10镜像创建 ...

  9. File Zilla server安装完报错could not load TLS libraries. aborting start of administration interface

    问题描述: 系统:Windows2008R2x64 安装完filezillaserver以后出现这个问题 解决方法: 需要安装个系统补丁:Windows6.1-KB2533623-x64 安装完重启服 ...

  10. 多进程操作-进程队列multiprocess.Queue的使用

    一.ipc机制 进程通讯 管道:pipe 基于共享的内存空间 队列:pipe+锁 queue 下面拿代码来实现Queue如何使用: 案例一: from multiprocessing import Q ...