:) Ch_someone

Ch_someone

九校联考_24OI——餐馆restaurant

凉心模拟D1T1——最简单的一道题 TAT

餐馆(restaurant)

题目背景

铜企鹅是企鹅餐馆的老板,他正在计划如何使得自己本年度收益增加。

题目描述

共有n 种食材,一份食材i 需要花ti 小时不间断地进行播种,施肥,
直至收获。当然,一份食材i 是可以直接卖掉得到wi 块钱的。
招牌菜共有m 种,一份招牌菜i 需要消耗一定的食材,花Ti 小时不
间断地来烹饪,叫卖,并最终卖出得到Wi 块钱。
整个季度换算下来一共有Tmax 小时可供你使用,铜企鹅需要在这期间
赚到最多的钱,这样他才有足够多的钱来steam 剁手,或者氪金手游。

格式

输入格式

第一行一个整数T,表示数据组数。
令i 表示为当前数据内行数。
第一行三个整数n; m; Tmax,含义如题所示。
第二行至第n + 1 行,每行两个整数ti􀀀1;wi􀀀1,含义如题所示。
第n + 2 行至第n + m + 1 行,每行两个整数Ti􀀀n􀀀1;Wi􀀀n􀀀2,含义如
题所示。
第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  阅读(299)  评论(0编辑  收藏  举报

导航