九校联考_24OI——餐馆restaurant
凉心模拟D1T1——最简单的一道题 TAT
餐馆(restaurant)
题目背景
铜企鹅是企鹅餐馆的老板,他正在计划如何使得自己本年度收益增加。
题目描述
共有n 种食材,一份食材i 需要花ti 小时不间断地进行播种,施肥,
直至收获。当然,一份食材i 是可以直接卖掉得到wi 块钱的。
招牌菜共有m 种,一份招牌菜i 需要消耗一定的食材,花Ti 小时不
间断地来烹饪,叫卖,并最终卖出得到Wi 块钱。
整个季度换算下来一共有Tmax 小时可供你使用,铜企鹅需要在这期间
赚到最多的钱,这样他才有足够多的钱来steam 剁手,或者氪金手游。
格式
输入格式
第一行一个整数T,表示数据组数。
令i 表示为当前数据内行数。
第一行三个整数n; m; Tmax,含义如题所示。
第二行至第n + 1 行,每行两个整数ti1;wi1,含义如题所示。
第n + 2 行至第n + m + 1 行,每行两个整数Tin1;Win2,含义如
题所示。
第n + m + 2 行至第n + 2m + 1 行,每行n 个整数,第j 个数dj 表
示招牌菜i n m 1 需要dj 个食材j。
输出格式
对于每组数据,输出一行一个整数,表示你所能赚到的最多的钱。
样例
样例输入
31
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
样例输出
53728
410
1464
3
数据范围
Subtask | 分值 | \(n\le\) | \(m\le\) | \(T\le\) |
---|---|---|---|---|
1 | 3 | 1 | 1 | 0 |
2 | 20 | 1 | 1 | 5 |
3 | 10 | 4 | 4 | 5 |
4 | 17 | 2000 | 0 | 5 |
5 | 50 | 2000 | 2000 | 4 |
对于\(100\%\) 的数据,保证\(0 < t_i,T_i \le T_{max} \le 5000, 0 \le w_i,W_i \le 10^9\),
每份招牌菜使用的食材的个数总数不超过\(10^5\)。
解析
大家看到这道题是不是一眼秒啊。
把所有的成品菜需要的总时间和价钱算出来,作为物品,和食材一起就是完全背包问题,结束了。
然鹅我写的是多重背包的代码TAT,而且没写快读,所以T了。
代码
写了一堆废话……
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
const int maxn = 2e5 + 5;
ll dp[5005];
ll n,m,tmax,t;
ll dishw[maxn];
ll dishv[maxn];
ll read()
{
ll ans = 0,op = 1;
char ch = getchar();
while(ch < '0' || ch > '9')
{
if(ch == '-') op = -1;
ch = getchar();
}
while(ch >= '0' && ch <= '9')
{
ans *= 10;
ans += ch - '0';
ch = getchar();
}
return ans * op;
}
struct th
{
ll w;
ll v;
double k;
};
th re[maxn];
int main()
{
// freopen("restaurant.in","r",stdin);
// freopen("restaurant.out","w",stdout);
scanf("%d",&t);
for(int ct=1; ct<=t; ct++)
{
n = read();
m = read();
tmax = read();
int cnt = 0;
ll minn = 1e9+10;
for(int i=1; i<=n; i++)
{
ll a;
ll b;
a = read();
b = read();
re[++cnt].w = a;
re[cnt].v = b;
}
for(int i=1; i<=m; i++)
{
dishw[i] = read();
dishv[i] = read();
}
for(int i=1; i<=m; i++)
{
ll numm;
re[++cnt].w = dishw[i];
for(ll j=1; j<=n; j++)
{
numm = read();
re[cnt].w += re[j].w * numm;
}
re[cnt].v = dishv[i];
}
for(int i=1; i<=cnt; i++)
{
for(ll j=re[i].w; j<=tmax; j++)
{
dp[j] = max(dp[j],dp[j-re[i].w]+re[i].v);
}
}
printf("%lld\n",dp[tmax]);
memset(dp,0,sizeof(dp));
}
return 0;
}
posted on 2018-09-08 21:05 Ch_someone 阅读(307) 评论(0) 编辑 收藏 举报