题解 \(by\;zj\varphi\)

一道 \(\rm dp\) 题。

现将所有种类从小到大排序,然后判断,若最小的已经大于了 \(\rm l\),那么直接就是一个裸的完全背包,因为选的总数量有限制。

设 \(\rm f_{i,j,k}\) 为选了前 \(\rm i\) 种物品,总数为 \(\rm j\),容量为 \(\rm k\),是否可行,转移很简单。

对于另一种情况,能构造出的最小差距就是 \(v_1\),那么只要记录一下模 \(\rm v_1\) 的值即可。

设 \(\rm f_{i,j}\) 为选了 \(\rm i\) 个有限制的物品,模数为 \(j\) 的状态下最小和为多少,则有转移方程:

\[\rm f_{i,j}=\min(f_{i,j},f_{i,(j-v_i)mod\;v_1}+v_i)\;\; v_i<l\\
f_{i,j}=\min(f_{i,j},f_{i-1,(j-v_i)mod\;v_1}+v_i)\;\; v_i\ge l
\]

发现这个转移会出现环,所以直接最短路。

#include<bits/stdc++.h>
#define ri register signed
#define p(i) ++i
namespace IO{
char buf[1<<21],*p1=buf,*p2=buf;
#define gc() p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?(-1):*p1++
struct nanfeng_stream{
template<typename T>inline nanfeng_stream &operator>>(T &x) {
ri f=0;x=0;register char ch=gc();
while(!isdigit(ch)) {f|=ch=='-';ch=gc();}
while(isdigit(ch)) {x=(x<<1)+(x<<3)+(ch^48);ch=gc();}
return x=f?-x:x,*this;
}
}cin;
}
using IO::cin;
namespace nanfeng{
#define node(nm,v,dis) (node){nm,v,dis}
#define FI FILE *IN
#define FO FILE *OUT
template<typename T>inline T cmax(T x,T y) {return x>y?x:y;}
template<typename T>inline T cmin(T x,T y) {return x>y?y:x;}
typedef long long ll;
static const int N=51,M=3e5+7,C=31,V=1e4+7;
int v[N],n,m,l,c;
bool vis[C][V];
ll dis[C][V];
struct node{int nm,v;ll dis;};
std::queue<node> que;
std::bitset<M> f[N][C];
inline void spfa() {
memset(dis,127,sizeof(dis));
dis[0][0]=0;
que.push(node(0,0,0));
while(!que.empty()) {
node nw=que.front();que.pop();
vis[nw.nm][nw.v]=0;
for (ri i(2);i<=n;p(i)) {
int tmp;
if (v[i]<l) {
if (dis[nw.nm][tmp=(nw.v+v[i])%v[1]]>nw.dis+v[i]) {
dis[nw.nm][tmp]=nw.dis+v[i];
if (!vis[nw.nm][tmp]) que.push(node(nw.nm,tmp,nw.dis+v[i])),vis[nw.nm][tmp]=1;
}
} else if (nw.nm<c) {
if (dis[nw.nm+1][tmp=(nw.v+v[i])%v[1]]>nw.dis+v[i]) {
dis[nw.nm+1][tmp]=nw.dis+v[i];
if (!vis[nw.nm+1][tmp]) que.push(node(nw.nm+1,tmp,nw.dis+v[i])),vis[nw.nm+1][tmp]=1;
}
}
}
}
}
inline int main() {
//FI=freopen("nanfeng.in","r",stdin);
//FO=freopen("nanfeng.out","w",stdout);
cin >> n >> m;
for (ri i(1);i<=n;p(i)) cin >> v[i];
cin >> l >> c;
std::sort(v+1,v+n+1);
if (v[1]>=l) {
f[0][0][0]=1;
for (ri i(1);i<=n;p(i)) {
for (ri j(0);j<=c;p(j)) {
f[i][j]=f[i-1][j];
if (j) f[i][j]|=f[i][j-1]<<v[i];
}
}
for (ri i(0);i<c;p(i)) f[n][c]|=f[n][i];
for (ri i(1);i<=m;p(i)) {
ll w;cin >> w;
if (w>=M) puts("No");
else printf("%s\n",f[n][c][w]?"Yes":"No");
}
} else if (v[1]<l) {
spfa();
for (ri i(0);i<c;p(i))
for (ri j(0);j<v[1];p(j)) dis[c][j]=cmin(dis[c][j],dis[i][j]);
for (ri i(1);i<=m;p(i)) {
ll w;cin >> w;
printf("%s\n",w>=dis[c][w%v[1]]?"Yes":"No");
}
}
return 0;
}
}
int main() {return nanfeng::main();}\

NOIP 模拟 $29\; \rm 完全背包问题$的更多相关文章

  1. NOIP 模拟 $29\; \rm 最近公共祖先$

    题解 \(by\;zj\varphi\) 首先考虑,如果将一个点修改成了黑点,那么它能够造成多少贡献. 它先会对自己的子树中的答案造成 \(w_x\) 的贡献. 考虑祖先时,它会对不包括自己的子树造成 ...

  2. NOIP 模拟 $29\; \rm 最长不下降子序列$

    题解 \(by\;zj\varphi\) 观察这个序列,发现模数很小,所以它的循环节很小. 那么可以直接在循环节上做最长上升子序列,但是循环节中的逆序对会对拼接后的答案造成影响. 没有必要找逆序对个数 ...

  3. noip模拟29[简单的板子题](虽然我不会)

    \(noip模拟29\;solutions\) 这次考试给我最大的伤害,让我意识到了差距 这场考试可以说是非常的简单,就是简单到,看两眼,打个表就有结果了 但是呢?我考得非常的完蛋,只有30pts 据 ...

  4. NOIP模拟 1

    NOIP模拟1,到现在时间已经比较长了.. 那天是6.14,今天7.18了 //然鹅我看着最前边缺失的模拟1,还是终于忍不住把它补上,为了保持顺序2345重新发布了一遍.. #   用  户  名   ...

  5. 2021.5.22 noip模拟1

    这场考试考得很烂 连暴力都没打好 只拿了25分,,,,,,,,好好总结 T1序列 A. 序列 题目描述 HZ每周一都要举行升旗仪式,国旗班会站成一整列整齐的向前行进. 郭神作为摄像师想要选取其中一段照 ...

  6. NOIP 模拟 $22\; \rm f$

    题解 \(by\;zj\varphi\) 对于一个数,如果它二进制下第 \(i\) 位为 \(1\),那么 \(\rm x\) 在这一位选 \(1\) 的贡献就是和它不同的最高为为 \(i\) 的数的 ...

  7. NOIP模拟3

    期望得分:30+90+100=220 实际得分:30+0+10=40 T1智障错误:n*m是n行m列,硬是做成了m行n列 T2智障错误:读入三个数写了两个%d T3智障错误:数值相同不代表是同一个数 ...

  8. 7.22 NOIP模拟7

    又是炸掉的一次考试 T1.方程的解 本次考试最容易骗分的一道题,但是由于T2花的时间太多,我竟然连a+b=c都没判..暴力掉了40分. 首先a+b=c,只有一组解. 然后是a=1,b=1,答案是c-1 ...

  9. NOIP模拟 29

    T1第一眼觉得是网络流 看见4e6条边200次增广我犹豫了 O(n)都过不去的赶脚.. 可是除了网络流板子我还会什么呢 于是交了个智障的EK 还是用dijkstra跑的 居然有50分!$(RP--)$ ...

随机推荐

  1. XCTF command_execution

    讲道理这题算是我的思路盲区,先试着ping下本地的地址,127.0.0.1 看了大佬的wp时,我突然意识到,这是放在服务器上执行的,而且服务器一般都是linux系统的,所以linux命令是必需的, 思 ...

  2. linux驱动之LED驱动

    通过之前的学习,了解到linux驱动编写的流程是:先通过注册函数注册我们编写的入口函数,然后在入口函数中获取设备号->注册字符设备->自动创建设备节点->获取设备树信息,最后通过销毁 ...

  3. postgresql安装及配置

    目录 1. 安装 2. PostgrepSQL的简单配置 2.1 修改监听的ip和端口 2.2 修改数据库log相关的参数 2.3 内存参数 3. 数据库的基础操作 3.1 连接数据库控制台 3.2 ...

  4. ctf之SusCTF2017-Caesar cipher

    由题目名字SusCTF2017-Caesar cipher可知,该题目考察凯撒密码. 直接下载附件打开如图 由题目描述可知,提交的flag格式为Susctf{}.在网上搜索在凯撒密码解密. 偏移量为3 ...

  5. PYTHON 读取ADB记录文件输入ACTIVITY

    import re lb=[] with open("daaa.txt",encoding="utf8") as f: data = f.readlines() ...

  6. Java开源协同办公项目:数据中心,自定义查询语句使用教程

    O2OA提供的数据管理中心,可以让用户通过配置的形式完成对数据的汇总,统计和数据分组展现,查询和搜索数据形成列表数据展现.也支持用户配置独立的数据表来适应特殊的业务的数据存储需求.本文主要介绍如何在O ...

  7. Python+Requests+异步线程池爬取视频到本地

    1.本次项目为获取梨视频中的视频,再使用异步线程池下载视频到本地 2.获取视频时,其地址中的Url是会动态变化,不播放时src值为图片的地址,播放时src值为mp4格式 3.查看视频链接是否存在aja ...

  8. Unittest方法 -- 以test开头实例

    此篇是以下面的test作为实战的 : Unittest方法 -- 项目实现自动发送邮件 1.test_01 import unittestfrom selenium import webdriverc ...

  9. 【C#】C#中使用GDAL3(二):Windows下读写Shape文件及超详细解决中文乱码问题

    转载请注明原文地址:https://www.cnblogs.com/litou/p/15035790.html 本文为<C#中使用GDAL3>的第二篇,总目录地址:https://www. ...

  10. GIS数据资源下载

    GeoJSON数据下载 1.全国.省.市.县级geojson数据下载 地址:http://datav.aliyun.com/tools/atlas/#&lat=33.5219039961561 ...