题面

题解

考场上蠢了……这么简单的东西都想不到……

首先排序加去重。

先来考虑一下,形如

\[a_1x_1+a_2x_2+...a_nx_n=w,a_1<a_2<...<a_n,x_i\geq 0
\]

的方程该怎么判断是否有解

首先,把两边都放到模\(a_1\)的意义下,就是

\[a_2x_2+...a_nx_n\equiv w\pmod{a_1}
\]

然后是一个神仙的转化,我们设有\(a_1\)个点,分别代表\(0,1,...,a_1-1\),对于每一个点\(u\),都连出去\(n-1\)条边,分别连向\((a+a_i)\%a_1\),代价为\(a_i\)。那么我们对这个图跑一遍最短路,如果\(dis_{w\%a_1}\leq w\),那么显然可以用这条最短路上的所有边加上若干个\(a_1\)构成\(w\),否则的话肯定不行

那么对于大于等于\(L\)的部分我们可以暴力\(dp\),设\(dp_{i,j}\)表示选了\(i\)个数,其中这\(i\)个数的和模\(a_1\)后为\(j\)(\(a_1\)就是最小的数),这\(i\)个数的和最小是多少,直接大力转移即可。

最后用\(dp_{i,j}\)更新\(dis_j\),然后从每一个不为\(inf\)的\(dis_j\)出发,以所有\(a_i< L\)为边,跑多源最短路就行了

ps:其实严格来说如果\(a_1\geq L\)的话会发现上面的做法是错的,不过错的只有最短路那部分,暴力\(dp\)还是正确的,所以忽视这一点也没问题

//minamoto
#include<bits/stdc++.h>
#define R register
#define ll long long
#define inf 0x3f3f3f3f
#define fp(i,a,b) for(R int i=a,I=b+1;i<I;++i)
#define fd(i,a,b) for(R int i=a,I=b-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
using namespace std;
char buf[1<<21],*p1=buf,*p2=buf;
inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
ll read(){
R ll res,f=1;R char ch;
while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);
for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');
return res*f;
}
const int N=55,M=10005;
struct node{
int u,d;
node(){}
node(R int U,R int D):u(U),d(D){}
inline bool operator <(const node &b)const{return d>b.d;}
};priority_queue<node>q;
bitset<N*M>f[N];int a[N],vis[M];
int n,m,p,l,c,lim,u,v;ll w,dis[M],dp[N][M];
void mdzz(){
memset(dis,0x3f,sizeof(dis));
fp(i,0,a[1]-1){
fp(j,0,c)cmin(dis[i],dp[j][i]);
if(dis[i]!=inf)q.push(node(i,dis[i]));
}
while(!q.empty()){
u=q.top().u,q.pop();
if(vis[u])continue;vis[u]=1;
fp(i,2,p)if(cmin(dis[v=(u+a[i])%a[1]],dis[u]+a[i]))q.push(node(v,dis[v]));
}
}
int main(){
// freopen("testdata.in","r",stdin);
freopen("bag.in","r",stdin);
freopen("bag.out","w",stdout);
n=read(),m=read();
fp(i,1,n)a[i]=read();
sort(a+1,a+1+n),n=unique(a+1,a+1+n)-a-1;
l=read(),c=read(),p=lower_bound(a+1,a+1+n,l)-a-1;
memset(dp,0x3f,sizeof(dp));
dp[0][0]=0;
fp(i,p+1,n)fp(k,0,c-1)fp(j,0,a[1]-1){
v=(j+a[i])%a[1];
cmin(dp[k+1][v],dp[k][j]+a[i]);
}
mdzz();
while(m--){
w=read();
puts(dis[w%a[1]]<=w?"Yes":"No");
}
return 0;
}

jzoj4916. 【GDOI2017模拟12.9】完全背包问题 (背包+最短路)的更多相关文章

  1. jzoj4918. 【GDOI2017模拟12.9】最近公共祖先 (树链剖分+线段树)

    题面 题解 首先,点变黑的过程是不可逆的,黑化了就再也洗不白了 其次,对于\(v\)的祖先\(rt\),\(rt\)能用来更新答案当且仅当\(sz_{rt}>sz_{x}\),其中\(sz\)表 ...

  2. jzoj4915. 【GDOI2017模拟12.9】最长不下降子序列 (数列)

    题面 题解 调了好几个小时啊--话说我考试的时候脑子里到底在想啥-- 首先,这个数列肯定是有循环节的,而且循环节的长度\(T\)不会超过\(D\) 那么就可以把数列分成三份,\(L+S+R\),其中\ ...

  3. 【GDOI2017模拟12.9】最近公共祖先

    题目 分析 首先,将这些节点按dfs序建一棵线段树. 因为按dfs序,所以在同一子树上的节点会放在线段树相邻的位置. 发现,对于一个位置x,它的权值只会对以x为根的子树造成影响. 当修改x时,用w[x ...

  4. [JZOJ4913] 【GDOI2017模拟12.3】告别

    题目 描述 题目大意 给你两个排列AAA和BBB,每次随即选三个数进行轮换操作,问mmm次操作内使AAA变成BBB的概率. 思考历程 首先随便搞一下,就变成了AAA中每个数回归自己原位. 一眼望去,感 ...

  5. 【JZOJ4925】【GDOI2017模拟12.18】稻草人

    题目描述 YLOI村有一片荒地,上面竖着N个稻草人,村民们每年多次在稻草人们的周围举行祭典. 有一次,YLOI村的村长听到了稻草人们的启示,计划在荒地中开垦一片田地.和启示中的一样,田地需要满足以下条 ...

  6. noip模拟12[简单的区间·简单的玄学·简单的填数]

    noip模拟12 solutions 这次考试靠的还是比较好的,但是还是有不好的地方, 为啥嘞??因为我觉得我排列组合好像白学了诶,文化课都忘记了 正难则反!!!!!!!! 害没关系啦,一共拿到了\( ...

  7. BZOJ 3163: [Heoi2013]Eden的新背包问题( 背包dp )

    从左到右, 从右到左分别dp一次, 然后就可以回答询问了. ---------------------------------------------------------- #include< ...

  8. 【JZOJ5081】【GDSOI2017第三轮模拟】Travel Plan 背包问题+双指针+树的dfs序

    题面 100 注意到ban的只会是一个子树,所以我们把原树转化为dfs序列. 然后题目就转化为,询问一段ban的区间,之后的背包问题. 比赛的时候,我想到这里,于是就开始想区间合并,于是搞了线段树合并 ...

  9. Noip模拟12 2021.7.12

    T1 interval 亏得昨天晚上改掉了T3并且理解了单调栈,今天一扫这题目就知道要用啥了. 先预处理出以a[i]为最大值的最大左右区间.然后再将a[i]取%!!!是的,要不然会影响单调栈的使用.. ...

随机推荐

  1. Jetty + Servlet 实现文件下载

    Jetty非常适合做嵌入式web开发,正如Jetty的口号"Don’t deploy your application in Jetty, deploy Jetty in your appl ...

  2. Python使用类

    #coding:utf8 from selenium import webdriverfrom time import sleep class urlpage(object): #创建浏览器对象 de ...

  3. spring容器启动的三种方式

    一.在Web项目中,启动Spring容器的方式有三种,ContextLoaderListener.ContextLoadServlet.ContextLoaderPlugin. 1.1.监听器方式: ...

  4. IDEA编译器如何去掉注释中参数错误的提示

    在使用idea的导入别人的项目的时候经常会在方法注释中出现参数错误的提示,这时我们可以参考下面的配置,将方法注释中的参数错误的提示,更新为警告提示~~ 具体使用方法,参考下图~

  5. struts2中常用constant命令配置

    struts.objectFactory这个属性用 于说明Struts2的 对象池创建工厂,Struts2也有自己的对象池,就像Spring那样,在配置文件中你可以引用对象池中的对象,你可以借助于Sp ...

  6. 第十课 go语言函数

    1 内置函数 len() 函数可以接受不同类型参数并返回该类型的长度. 如果我们传入的是字符串则返回字符串的长度, 如果传入的是数组,则返回数组中包含的元素个数. 2  自定义函数 // 函数返回单个 ...

  7. jenkins学习 02 jenkins安装与配置

    1:  Jenkins安装 在最简单的情况下,Jenkins 只需要两个步骤: (1)下载最新的版本(一个 WAR 文件).Jenkins官方网址: http://Jenkins-ci.org/ (2 ...

  8. app中使用微信分享注意事项

    1.  在微信公众平台开通一个微信公众号,https://mp.weixin.qq.com 2.  将自己制作好的已签名的app安装到手机上 3.  下载微信开放平台获取应用签名的apk--- gen ...

  9. python学习笔记(一):python简介和入门

    最近重新开始学习python,之前也自学过一段时间python,对python还算有点了解,本次重新认识python,也算当写一个小小的教程.一.什么是python?python是一种面向对象.解释型 ...

  10. CDM中,实体与实体快捷方式之间的联系不能重复,否则会造成外键重复

    例如机场实体和跑道实体,例如: 在机场包中,跑道实体作为快捷方式出现,机场实体与跑道快捷方式实体间有连线关系,然而 在跑道包中,情况相反,但二者间也有连线.(模型原样) 要注意的是,虽然在两个包中都有 ...