题目大意:
解题思路:
多重背包
+
+
+ 二进制优化
先算出超过
p
p
p至少要多少空间。然后在算出这个空间至少需要多少价钱。
A c c e p t e d c o d e : Accepted\ code: Accepted code:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define rr register
using namespace std;
const int N = 50005;
int n, m, p, q, ans;
int f[N], g[N];
inline signed read() {
int f = 0; char c = getchar();
while (!isdigit(c)) c = getchar();
while (isdigit(c)) f = f * 10 + c - 48, c = getchar();
return f;
}
void write(int x) {
if (x > 9) write(x/10); putchar(x%10+48); return;
}
int main() {
q = read();
while (q--) {
n = read(), m = read(), p = read();
memset(f, 0, sizeof f);
memset(g, 0, sizeof g);
for (rr int i = 1; i <= n; i++) {
int t = read(), u = read(), w = read();
for (rr int j = 1; j <= w; w -= j, j <<= 1) {
int xx = u * j, yy = t * j;
for (rr int i = 20000; i >= xx; --i)
f[i] = max(f[i], f[i-xx] + yy);
}
if (w) {
int xx = u * w, yy = t * w;
for (rr int i = 20000; i >= xx; --i)
f[i] = max(f[i], f[i-xx] + yy);
}
}
for (rr int i = 1; i <= m; ++i) {
int x = read(), y = read(), k = read();
for (rr int j = 1; j <= k; k -= j, j <<= 1) {
int xx = y * j, yy = x * j;
for (rr int i = 50000; i >= xx; --i)
g[i] = max(g[i], g[i-xx] + yy);
}
if (k) {
int xx = y * k, yy = x * k;
for (rr int i = 50000; i >= xx; --i)
g[i] = max(g[i], g[i-xx] + yy);
}
}
ans = 0;
for (rr int i = 1; i <= 50000; i++)
if (f[g[i]] >= p) { ans=i; break; }
if (ans != 0)
write(ans), putchar(10); else puts("TAT");
}
}