Hdu 5445 Food Problem (2015长春网络赛 ACM/ICPC Asia Regional Changchun Online)

时间:2023-03-08 20:36:04

题目链接:

  Hdu  5445 Food Problem

题目描述:

  有n种甜点,每种都有三个属性(能量,空间,数目),有m辆卡车,每种都有是三个属性(空间,花费,数目)。问至少运输p能量的甜点,花费最小是多少?

解题思路:

  明显可以看出是多重背包搞两次,但是数据范围太大了,背包要到2*1e6,感觉会TLe。还是呆呆的写了一发,果断超啊!然后滚回去看背包九讲课件了,看到了二进制压缩的时候,感觉可以搞这个题目。试了一下果然AC,原本物品数目是100*100,二进制压缩以后也就是100*log2100个左右,然后进行01背包就OK咯!

 #include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int INF = 0x3f3f3f3f;
const int maxn = ;
const int N = ;
int dp[maxn], x, y, c1, c2;
int dcos[N], dval[N], tcos[N], tval[N];
void display ()
{
for (int i=; i<c1+; i++)
dp[i] = INF;
dp[] = ;
for (int i=; i<x; i++)
for (int j=c1+; j>=dval[i]; j--)
dp[j] = min (dp[j], dp[j-dval[i]]+dcos[i]);
c2 = dp[c1];
for (int i=c1; i<c1+; i++)
c2 = min (dp[i], c2);
}
void solve ()
{
memset (dp, , sizeof(dp));
for (int i=; i<y; i++)
for (int j=; j>=tcos[i]; j--)
dp[j] = max (dp[j], dp[j-tcos[i]]+tval[i]);
for (int i=; i<=; i++)
if (dp[i] >= c2)
{
printf ("%d\n", i);
return ;
}
printf ("TAT\n");
}
int main ()
{
int t, n, m;
scanf ("%d", &t);
while (t --)
{
scanf ("%d %d %d", &n, &m, &c1);
int a, b, c;
x = y = ;
for (int i=; i<n; i++)
{
scanf ("%d %d %d", &a, &b, &c);
for (int k=; c; k*=)
{
int num = min (k, c);
dcos[x] = num * b;
dval[x++] = num * a;
c -= num;
}
}
for (int i=; i<m; i++)
{
scanf ("%d %d %d", &a, &b, &c);
for (int k=; c; k*=)
{
int num = min (k, c);
tcos[y] = num * b;
tval[y++] = num * a;
c -= num;
}
}
display ();
solve ();
}
return ;
}