洛谷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,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)