1600+人过的题排#32还不错嘿嘿

  浴谷夏令营讲过的题,居然1A了

  预处理出f[i]表示购买价值为i的东西的方案数

  然后每次询问进行一次容斥,答案为总方案数-第一种硬币超限方案-第二种超限方案-第三种超限方案-第四种超限方案+第一种和第二种硬币超限方案+...

  第i种硬币超限方案就是f[s-c[i]*(d[i]+1)],其他的类推一下就行了

#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
#define ll long long
using namespace std;
const int maxn=,inf=1e9;
int n,mx;
ll ans;
int c[],d[maxn][],s[maxn];
ll f[maxn];
void read(int &k)
{
int f=;k=;char c=getchar();
while(c<''||c>'')c=='-'&&(f=-),c=getchar();
while(c<=''&&c>='')k=k*+c-'',c=getchar();
k*=f;
}
void dfs(int fir,int dep,int sum,int last)
{
for(int i=last;i<=;i++)
{
if(sum+c[i]*(d[fir][i]+)>s[fir])continue;
if(dep&)ans-=f[s[fir]-sum-c[i]*(d[fir][i]+)];
else ans+=f[s[fir]-sum-c[i]*(d[fir][i]+)];
dfs(fir,dep+,sum+c[i]*(d[fir][i]+),i+);
}
}
int main()
{
for(int i=;i<=;i++)read(c[i]);read(n);
for(int i=;i<=n;i++)
{
for(int j=;j<=;j++)read(d[i][j]);
read(s[i]);mx=max(mx,s[i]);
}
f[]=;
for(int i=;i<=;i++)
for(int j=c[i];j<=mx;j++)
f[j]+=f[j-c[i]];
for(int i=;i<=n;i++)
{
ans=f[s[i]];
dfs(i,,,);
printf("%lld\n",ans);
}
return ;
}

最新文章

  1. MySQL(Percona Server) 5.6 主从复制
  2. java后台访问接口
  3. NumberFormat类
  4. js- 千分位分割
  5. 【转】SVN 查看历史信息
  6. 函数buf_pool_init_instance
  7. 抓取锁的sql语句-第二次修改
  8. UE标签排列方式
  9. Android新浪微博客户端(三)——添加多个账户及认证
  10. TOGAF架构能力框架之架构委员会和架构合规性
  11. ubuntu 编译android源码
  12. 常用排序算法java实现
  13. EntityFramework Core笔记:查询数据(3)
  14. 满汉全席[2-SAT]
  15. Android的Activity组件
  16. 【SHELL】:定时任务删除指定目录
  17. 伪分布式hbase2.6.5和hbase1.1.2的配置
  18. Vue表单修饰符(lazy,number,trim)
  19. 8.3Solr API使用(StatsComponent聚合统计)
  20. go语言之进阶篇创建goroutine协程

热门文章

  1. Navicat 导入sql脚本文件
  2. 第一模块&#183;开发基础-第1章 Python基础语法
  3. win 下通过dos命令格式化磁盘
  4. Python中的赋值语法
  5. 王者荣耀交流协会beta冲刺贡献分分配结果
  6. 百度编辑器ueditor的图片地址修正
  7. C++与C#数据类型对应关系总结
  8. Java package和import语句
  9. lintcode-144-交错正负数
  10. TCP源码—连接建立