[JZOJ4916]完全背包问题
来源:互联网 发布:看电视台的软件 编辑:程序博客网 时间:2024/05/07 05:00
题目大意
有
题目分析
先考虑普通的暴力怎么做。
令
然后我们发现如果
但是如果
假设
那么这个东西如何转移呢?在
虽然这里写的是dp套dp,实际实现可以把
时间复杂度
代码实现
由于原题没有
#include <algorithm>#include <iostream>#include <climits>#include <cstdio>using namespace std;typedef long long LL;const LL INF=LLONG_MAX/2;const int N=55;const int V=10005;const int C=35;int v[N],p[N];LL f[C][N][V];//Large bag/Item ID/sum(V)%a[1]bool vis[V];int n,m,l,c,n0;void dp(int c0){ n0=0; for (int i=1;i<=n;i++) { if (v[i]>=l) break; n0=i; for (int j=0;j<v[1];j++) vis[j]=0; for (int j=0,mi;j<v[1];j++) { if (vis[j]) continue; p[0]=0,mi=-1; for (int x=j;!vis[x];(x+=v[i])%=v[1]) { vis[x]=1,p[++p[0]]=x; if (mi==-1||f[c0][i-1][x]<f[c0][i-1][mi]) mi=x; } f[c0][i][mi]=f[c0][i-1][mi]; for (int x=(mi+v[i])%v[1];x!=mi;(x+=v[i])%=v[1]) f[c0][i][x]=min(f[c0][i-1][x],f[c0][i][((x-v[i])%v[1]+v[1])%v[1]]+v[i]); } }}int main(){ freopen("bag.in","r",stdin),freopen("bag.out","w",stdout); scanf("%d%d",&n,&m); for (int i=1;i<=n;i++) scanf("%d",&v[i]); scanf("%d%d",&l,&c); sort(v+1,v+1+n); f[0][0][0]=0; for (int i=1;i<v[1];i++) f[0][0][i]=INF; dp(0); for (int i=1;i<=c;i++) { for (int j=0;j<v[1];j++) f[i][0][j]=INF; for (int j=n;j>=1;j--) { if (v[j]<l) break; for (int k=0;k<v[1];k++) f[i][0][k]=min(f[i][0][k],f[i-1][n0][((k-v[j])%v[1]+v[1])%v[1]]+v[j]); } dp(i); } for (int i=1;i<=m;i++) { LL w; bool ok=0; scanf("%lld",&w); for (int j=0;j<=c;j++) if (f[j][n0][w%v[1]]<=w) { ok=1; break; } printf(ok?"Yes\n":"No\n"); } fclose(stdin),fclose(stdout); return 0;}
- [JZOJ4916]完全背包问题
- JZOJ4916. 完全背包问题
- 【JZOJ4916】完全背包问题 题解
- 背包问题-完全背包-背包问题
- 01背包 完全背包问题
- 背包问题2:完全背包
- 01背包+完全背包问题
- nyoj311完全背包(完全背包问题)
- 完全背包问题
- 完全背包问题
- 完全背包问题
- 完全背包问题
- 完全背包问题
- P02: 完全背包问题
- 完全背包问题、、、
- P02: 完全背包问题
- 完全背包问题
- P02: 完全背包问题
- 图的操作(增删改查、遍历、最小生成树)的实现
- 1065. 单身狗(25)
- c++设计模式之迭代器模式
- 架构实现利器:反射
- 【C#】预处理命令
- [JZOJ4916]完全背包问题
- 【故障处理】一次RAC故障处理过程
- 线程与进程之间的区别与联系
- WebSocket 浅析
- 三次握手和四次挥手
- 三阶魔方 js
- CISSP复习笔记-第6章 通信与网络安全
- 在腾讯云上创建您的SQL Cluster(1)
- PHP基础复习