[多重背包][二进制优化]JZOJ 4224 食物
分析
显然多重背包,两个
f[i]表示美味度为i时的最小空间
g[i]表示花费为i时的最大空间
然后二进制优化
可是。。我居然T50???然后拼命卡常,吸氧,register,inline什么的全部都打一遍
还是T50
然后dalao跑过来跟我说,f[i]改成空间为i时的最大美味度,我说不会爆吗?他说STD都是这样的。。(看来STD的锅)
然后就迅速切了
#include <iostream> #include <cstdio> #include <memory.h> using namespace std; const int N=2e3+10; int T,n,m,p; int f[50010],g[50010]; inline void Max(int &a,int b) {a=a>b?a:b;} inline void F_Backpack(int a,int b) { for (register int i=20000;i>=b;--i) Max(f[i],f[i-b]+a); } inline void G_Backpack(int a,int b) { for (register int i=50000;i>=b;--i) Max(g[i],g[i-b]+a); } int main() { for (scanf("%d",&T);T;--T) { scanf("%d%d%d",&n,&m,&p); int nn=0,mm=0;memset(f,0,sizeof f);memset(g,0,sizeof g); for (register int i=1,a,b,c;i<=n;++i) { scanf("%d%d%d",&a,&b,&c); for (register int j=1;j<=c;j<<=1) F_Backpack(a*j,b*j),c-=j; if (c) F_Backpack(a*c,b*c); } for (register int i=1,a,b,c;i<=m;++i) { scanf("%d%d%d",&a,&b,&c); for (register int j=1;j<=c;j<<=1) G_Backpack(a*j,b*j),c-=j; if (c) G_Backpack(a*c,b*c); } int ans=0; for (int i=0;i<=50000;i++) if (f[g[i]]>=p) {ans=i;break;} printf(!ans?"TAT\n":"%d\n",ans); } }
在日渐沉没的世界里,我发现了你。