BZOJ 1042 硬币购物(背包DP+容斥原理)
2024-08-24 23:39:29
可以看出这是个多重背包,运用单调队列优化可以使每次询问达到O(s).这样总复杂度为O(s*tot). 会TLE。
因为改题的特殊性,每个硬币的币值是不变的,变的只是每次询问的硬币个数。
我们不妨不考虑硬币个数的限制。这样可以用完全背包在O(s)的时间求出dp[]数组,表示没有限制的种数。
现在加入每个硬币的限制后,由于容斥原理,答案就是没有限制的种数-第一个硬币的限制种数-第二个硬币限制种数......
如果加入第一个硬币的限制后怎么求呢。就相当于你先把第一个硬币用到刚超过限制,剩下的随便怎么选。此时的种数就是dp[s-(d[1]+1)*c[1]],d[1]表示第一种硬币的限制数,
c[1]表示第一种硬币的币值。 剩下的同理。
之后所以的询问都可以在O(1)的时间求出。
因此总复杂度为O(s+tot).
# include <cstdio>
# include <cstring>
# include <cstdlib>
# include <iostream>
# include <vector>
# include <queue>
# include <stack>
# include <map>
# include <set>
# include <cmath>
# include <algorithm>
using namespace std;
# define lowbit(x) ((x)&(-x))
# define pi acos(-1.0)
# define eps 1e-
# define MOD
# define INF
# define mem(a,b) memset(a,b,sizeof(a))
# define FOR(i,a,n) for(int i=a; i<=n; ++i)
# define FO(i,a,n) for(int i=a; i<n; ++i)
# define bug puts("H");
# define lch p<<,l,mid
# define rch p<<|,mid+,r
# define mp make_pair
# define pb push_back
typedef pair<int,int> PII;
typedef vector<int> VI;
# pragma comment(linker, "/STACK:1024000000,1024000000")
typedef long long LL;
int Scan() {
int res=, flag=;
char ch;
if((ch=getchar())=='-') flag=;
else if(ch>=''&&ch<='') res=ch-'';
while((ch=getchar())>=''&&ch<='') res=res*+(ch-'');
return flag?-res:res;
}
void Out(int a) {
if(a<) {putchar('-'); a=-a;}
if(a>=) Out(a/);
putchar(a%+'');
}
const int N=;
//Code begin... LL dp[N];
int c[], d[]; void init()
{
dp[]=;
FO(i,,) FO(j,c[i],N) dp[j]=dp[j]+dp[j-c[i]];
}
int main ()
{
scanf("%d%d%d%d%d",c,c+,c+,c+,c+);
init();
while (c[]--) {
scanf("%d%d%d%d%d",d,d+,d+,d+,d+);
LL ans=dp[d[]];
FO(i,,) {
int tot=, tmp=;
FO(j,,) if (i&(<<j)) ++tot, tmp+=(d[j]+)*c[j];
if (tmp<=d[]) ans+=((tot&)?-dp[d[]-tmp]:dp[d[]-tmp]);
}
printf("%lld\n",ans);
}
return ;
}
最新文章
- CSS float 浮动属性
- ABP源码分析三十六:ABP.Web.Api
- 网页插件学javascript还是jquery好啊?
- RabbitMQ原理与相关操作(三)消息持久化
- jQuery中异步操作对象Deferred
- AEAI CRM客户关系管理升级说明
- 任务管理界面添加显示RAM信息
- css table表格无法调整宽度问题分析
- Css3做的旋转显示文字和角度的变化
- case then 的用法 貌似case then不支持别名
- Hadoop权威指南学习笔记二
- Session小案例------完成用户登录
- 如何打造100亿SDK累计覆盖量的大数据系统
- 每天一个Linux命令(02)--cd命令
- Python PycURL 网络编程
- ThinkPhp_5框架开发【整理】
- java web项目最简单的结构
- Android开发工程师文集-1 小时学会各种Drawable
- 浅谈博弈论中的两个基本模型——Bash Game&;&;Nim Game
- php7连接 sqlserver踩过的坑,could not find driver解决方式