题目链接
农场大亨-美团2023笔试(codefun2000)
题目内容
塔子哥是一个喜欢种田类的游戏的人,他觉得这样的游戏可以让他体验到农民的乐趣,同时也可以锻炼他的经营能力。他最近在玩一个叫做“农场大亨”的游戏,这个游戏的目的是在有限的时间内赚尽可能多的钱。游戏中有 n 种作物,每种作物都有自己的特点,比如生长周期、种子成本、作物收益等。塔子哥需要根据这些信息,合理地安排自己的种植计划,以达到最大化利润的目标。塔子哥只有一块土地,也就是说每个时间只能由一个作物在生长。他需要在游戏开始时购买种子,然后种植在土地上。种子的买入价格为 ai,作物卖出价格 bi。一个种子只会产出一个作物,种子可以重复购买。第 i 种作物从种植到作物成熟采摘需要 ti天时间,种植和采摘、卖出等操作不耗时间,成熟之前作物没有价值。如果塔子哥想要更换作物,他需要先把当前作物采摘卖出,然后再购买新的种子。
游戏内总时长为 m 天,也就是说塔子哥只有 m 天的时间来经营自己的农场。塔子哥初始的钱足够多,不用担心资金不足。塔子哥想知道,在这样的条件下,他最多能赚多少钱。
输入描述
第一行两个整数 n , m (1≤n,m≤1000) 表示作物种类数和游戏时长;
第二行 n 个正整数,表示每种作物的成熟时长 𝑡𝑖 (1≤ti ≤m);
第三行 n 个正整数,表示每种作物的种子价格 𝑎𝑖 (1≤ai≤100000);
第四行 n 个正整数,表示每种作物的卖出价格 𝑏𝑖 (ai≤bi≤100000) 。
输出描述
输出一个整数来表示塔子哥最多能赚的钱。
样例1
输入
3 12
3 4 7
9 3 2
11 6 11
输出
12
样例1解释
赚钱最多的方案是先种一个第二种作物,然后种一个第三种作物,耗时
4+7=11 天,赚的钱数为
6−3+11−2=12 ,可以证明这是最优的方案。
样例2
输入
10 100
81 21 66 63 48 25 23 88 71 65
56 12 94 57 57 6 37 63 87 64
62 68 99 93 88 96 47 65 97 69
输出
360
题解1
#include<bits/stdc++.h>
using namespace std;
const int N = 1005;
int n, m, t[N], a[N], b[N], dp[N];
int main(){
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i++) scanf("%d", &t[i]);
for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
for(int i = 1; i <= n; i++) scanf("%d", &b[i]);
// 由于同一个种子可以重复购买,因此本题可以理解成完全背包来做,将总时长m看做背包容量,
// 种子从种植到采摘的时间t看成物品体积,卖出价格与买入价格之差看成价值
// 即在背包容量为m的情况下,所能得到的最大价值是多少
for(int i = 1; i <= n; i++){
for(int j = t[i]; j <= m; j++){
dp[j] = max(dp[j], dp[j - t[i]] + (b[i] - a[i]));
}
}
printf("%d\n", dp[m]);
return 0;
}