洛谷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;
}
posted @   chrispang  阅读(19)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)
点击右上角即可分享
微信分享提示