[多重背包][二进制优化]JZOJ 4224 食物

Description

 

Input

Output

 

Sample Input

4
1 1 7
14 2 1
1 2 2
1 1 10
10 10 1
5 7 2
5 3 34
1 4 1
9 4 2
5 3 3
1 3 3
5 3 2
3 4 5
6 7 5
5 3 8
1 1 1
1 2 1
1 1 1

Sample Output

4
14
12
TAT
 

Data Constraint

分析

显然多重背包,两个

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);
    }
}
View Code

 

posted @ 2019-01-27 11:36  Vagari  阅读(198)  评论(0编辑  收藏  举报