用C++作答:题目背景此题为纪念 LiYuxiang 而生。题目描述LiYuxiang 是个天资聪颖的孩子他的梦想是成为世界上最伟大的医师。为此他想拜附近最有威望的医师为师。医师为了判断他的资质给他出了一个难题。医师把他带到一个到处都是草药的山洞里对他说:孩子这个山洞里有一些不同种类的草药采每一种都需要一些时间每一种也有它自身的价值。我会给你一段时间在这段时间里你可以采到一些草药。如果你是一个聪明
这道题可以使用动态规划来解决。
我们定义一个二维数组dp[i][j],表示在前i种草药中,采摘总时间不超过j的情况下,可以采到的草药的最大总价值。
对于dp[i][j],有两种情况:
-
不采摘第i种草药,那么dp[i][j] = dp[i-1][j],表示在前i-1种草药中,采摘总时间不超过j的情况下,可以采到的草药的最大总价值。
-
采摘第i种草药,那么dp[i][j] = dp[i][j-a[i]] + b[i],表示在前i种草药中,采摘总时间不超过j-a[i]的情况下,可以采到的草药的最大总价值,再加上采摘第i种草药的价值b[i]。
因此,状态转移方程为:
dp[i][j] = max(dp[i-1][j], dp[i][j-a[i]] + b[i])
最终的答案就是dp[m][t]。
下面是C++的代码实现:
#include <iostream>
#include <vector>
using namespace std;
int main() {
int t, m;
cin >> t >> m;
vector<int> a(m+1);
vector<int> b(m+1);
for (int i = 1; i <= m; i++) {
cin >> a[i] >> b[i];
}
vector<vector<int>> dp(m+1, vector<int>(t+1, 0));
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= t; j++) {
if (j >= a[i]) {
dp[i][j] = max(dp[i-1][j], dp[i][j-a[i]] + b[i]);
} else {
dp[i][j] = dp[i-1][j];
}
}
}
cout << dp[m][t] << endl;
return 0;
}
时间复杂度分析: 由于有两层循环,时间复杂度为O(m*t)
原文地址: https://www.cveoy.top/t/topic/hXp7 著作权归作者所有。请勿转载和采集!