题目背景
铜企鹅是企鹅餐馆的老板,他正在计划如何使得自己本年度收益增加。
题目描述
共有n 种食材,一份食材i需要花ti小时不间断地进行播种,施肥,直至收获。当然,一份食材i是可以直接卖掉得到wi块钱的。招牌菜共有m种,一份招牌菜 i 需要消耗一定的食材,花Ti小时不间断地来烹饪,叫卖,并最终卖出得到Wi 块钱。 整个季度换算下来一共有Tmax 小时可供你使用,铜企鹅需要在这期间赚到最多的钱,~这样他才有足够多的钱来steam 剁手,或者氪金手游~。
1.3 格式
输入输出格式
输入格式:
第一行一个整数T,表示数据组数。 一行三个整数n; m; ,含义如题所示。 接下来nnn行,每行两个整数tit_{i}ti;wiw_{i}wi,含义如题所示。 接下来m行,每行两个整数Ti;Wi,含义如题所示。 接下来m行,每行n个整数,第j个数dj表示当前招牌菜需要dj个食材j。
输出格式:
对于每组数据,输出一行一个整数,表示你所能赚到的最多的钱。
输入输出样例
输入样例#1:
扫描二维码关注公众号,回复:
3120040 查看本文章
3
1 1 48
2 2000
9 21864
54
4 46
17 52
4 36
5 43
16 62
9 31659
1 20431
4 623
1 11961
4 5 3 5
5 4 3 4
3 3 3 3
4 4 5 5
10 0 48
10 41
18 48
2 14
22 65
12 77
7 48
4 85
2 61
24 85
8 34
输出样例#1: 复制
53728
410
1464
今天我们学校模拟了,本帅哥爆零了。不开心,求小姐姐安慰。
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int T,n,m,tot;
long long w[4003],t[4003],dp[5003];
//这是一个多重背包,把每道招牌菜都当成一个背包中的物品,然后就可以了
long long read(){
int ret = 0;
char c;
c = getchar();
while(c > '9'||c < '0')
{
c = getchar();
}
while(c >= '0' && c <= '9'){
ret = ret * 10 + c - '0';
c = getchar();
}
return ret;
}
int main()
{
T = read();
while(T--)
{
n = read();
m = read();
tot = read();
for(int i = 1;i <= n;i++)
{
t[i] = read();
w[i] = read();
}
for(int i = 1;i <= m;i++)
{
t[i + n] = read();
w[i + n] = read();
}
for(int i = 1;i <= m;i++)
{
for(int j = 1;j <= n;j++)
{
int x;
x = read();
t[i + n] += x * t[j];
}
}
memset(dp,0,sizeof(dp));
for(int i = 1;i <= n + m;i++)
{
for(int j = t[i];j <= tot;j++)
{
dp[j] = max(dp[j],dp[j - t[i]] + w[i]);
}
}
printf("%lld\n",dp[tot]);
}
return 0;
}