10.02 T1 背包

1 餐馆 (restaurant)

1.1 题目背景

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

1.2 题目描述

共有 n 种食材,一份食材 i 需要花 ti 小时不间断地进行播种,施肥, 直至收获。

当然,一份食材 i 是可以直接卖掉得到 wi 块钱的。

招牌菜共有 m 种,一份招牌菜 i 需要消耗一定的食材,花 Ti 小时不 间断地来烹饪,叫卖,并最终卖出得到 Wi 块钱。

整个季度换算下来一共有 Tmax 小时可供你使用,铜企鹅需要在这期间 赚到最多的钱,这样他才有足够多的钱来 steam 剁手,或者氪金手游。

1.3 格式

1.3.1

输入格式

第一行一个整数 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。

1.3.2 输出格式

对于每组数据,输出一行一个整数,表示你所能赚到的最多的钱。

 

 

这题我SB了,直接把招牌菜的时间算出来当做物品放到背包里面跑就可以了,同时注意此题卡读入。

code:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 using namespace std;
 5 long long w1[50000],t1[50006],f[5001],t2[30004],w2[20003];
 6 bool vis[10005];
 7 inline int Get(){
 8     register int rec=0;
 9     register char c;
10     register bool f=0;
11     for(c=getchar();c<'0'||c>'9';c=getchar())if(c=='-')f=true;
12     while(c>='0'&&c<='9'){
13         rec=(rec<<3)+(rec<<1)+c-'0';
14         c=getchar();
15     }
16     return f?(-rec):rec;
17 }
18 int main(){
19 //    ios::sync_with_stdio(false);
20 //    freopen("restaurant.in","r",stdin);
21     //freopen("restaurant.out","w",stdout);
22     int T;
23     T=Get();
24     while(T--){
25         memset(f,0,sizeof f);
26         memset(vis,0,sizeof vis);
27         int n,m,Tmax;
28         n=Get(),m=Get(),Tmax=Get();
29         for(int i=1;i<=n;i++){
30             t1[i]=Get();
31             w1[i]=Get();
32         }
33         for(int i=1;i<=m;i++){
34             t1[i+n]=Get();
35             w1[i+n]=Get();
36         }
37         for(int i=1;i<=m;i++){
38             for(int j=1;j<=m;j++){
39                 long long x;x=Get();
40                 t1[i+n]+=1ll*t1[j]*x;
41             }
42         }
43         vis[0]=true;
44         for(int i=1;i<=m+n;i++){
45             for(int j=t1[i];j<=Tmax;j++){
46 //                if(f[j-t1[i]]||j==t1[i])
47 //                f[j]=max(f[j],f[j-t1[i]]+w1[i]);
48                 if(vis[j-t1[i]]&&f[j]<w1[i]+f[j-t1[i]])
49                     vis[j]=true,f[j]=w1[i]+f[j-t1[i]];
50             }
51         }
52         long long Rec=0;
53         for(int i=1;i<=Tmax;i++)if(f[i]>Rec)Rec=f[i];
54         cout<<Rec<<'\n';
55     }
56     return 0;
57 }

over

 

posted @ 2018-10-03 08:19  saionjisekai  阅读(28)  评论(0编辑  收藏  举报