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