1 条题解
-
0
方法思路
1.问题分析:问题要求从多个副本中选择若干副本,使得总时间不超过H,总精力不超过S,同时金币数最大。每个副本只能选择一次。
2.动态规划设置:使用一个二维数组dp,其中dp[i][j]表示在时间不超过i和精力不超过j的情况下能获得的最大金币数。
3.初始化:将dp数组初始化为0,表示初始状态下没有任何副本被选择时的金币数为0。 处理每个副本:对于每个副本,逆序遍历时间和精力维度,更新dp数组。确保在添加当前副本时,时间和精力不超过限制。
4.结果提取:最终结果存储在dp[H][S]中,表示在时间和精力限制下的最大金币数。
#include <iostream> #include <vector> #include <cmath> using namespace std; int main() { int N, H, S, i, j, k; cin >> N >> H >> S; vector<vector<int>> dp(H + 1, vector<int>(S + 1, 0)); for (i = 0; i < N; i++) { int m, t, p; cin >> m >> t >> p; for (j = H; j >= t; j--) { for (k = S; k >= p; k--) { dp[j][k] = max(dp[j][k], dp[j - t][k - p] + m); } } } cout << dp[H][S] << endl; return 0; }
- 1
信息
- ID
- 142
- 时间
- 2000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者