洛谷p1048 采药
本题其实是一个 \(01\) 背包的板子题,除了题目背景不同以外,其它的都一模一样!
- \(1\)、状态:
定义一个二维数组 f,\(f_{i\ j}\)表示前 \(i\) 种采药,时间为 \(j\) 时可以获得的最大价值。
- \(2\)、状态转移方程:
我们设当前时间为 \(j\) 采完这个草药需要的时间 \(t\),采摘这个草药可以获得的价值为 \(w\)。则分两种情况:
\(1.\) 如果 \(j \ge t\),那么可以选这个草药,也可以不选:\(f_{i\ j} = max(f_{i-1\ j}, \ f_{i-1\ j-t}+w)\)
\(2.\) 那么如果 \(j < t\),那么不能选这个草药:\(f_{i\ j} = f_{i-1\ j}\)
- \(3\)、初始化
由于如果当前时间为 \(0\),那么你是永远也凑不出来一个值的,所以 \(f_{i\ 0} = 0\)
- \(4\)、答案
我们最后要求时间为 \(T\) 时,求最大利益,那么也就是 \(max(f_{i\ T})(1 \le i \le n)\)
代码:
#include <bits/stdc++.h>
using namespace std;
int T, m, ans, f[110][1010]; //f[i][j]表示前i种草药时间为j时能采摘到达最大价值
struct node {
int t, w; //一个草药需要花费时间和得到价值
}a[110];
int main() {
cin >> T >> m;
for (int i = 1; i <= m; i++)
cin >> a[i].t >> a[i].w;
for (int i = 1; i <= m; i++)
f[i][0] = 0; //初始化
for (int i = 1; i <= m; i++)
for (int j = 1; j <= T; j++)
if(j >= a[i].t) f[i][j] = max(f[i - 1][j], f[i - 1][j - a[i].t] + a[i].w); //如果时间充足,则需要考虑选或不选
else f[i][j] = f[i - 1][j]; //否则不选
for (int i = 1; i <= m; i++)
ans = max(ans, f[i][T]); //找最佳答案
cout << ans << endl;
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】