感觉很好吧可能
2025-12-12 18:18:55
发布于:广东
6阅读
0回复
0点赞
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int MAX_MONEY = 10000; // 题目保证任意时刻金币不超过 10000
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int T, N, M;
cin >> T >> N >> M;
// 读入价格:price[i][j] 表示第 i 天(0-indexed)第 j 种纪念品的价格
vector<vector<int>> price(T, vector<int>(N));
for (int i = 0; i < T; ++i) {
for (int j = 0; j < N; ++j) {
cin >> price[i][j];
}
}
int money = M;
// 从第 0 天到第 T-2 天(共 T-1 天),每天进行一次投资决策
for (int i = 0; i < T - 1; ++i) {
// dp[x] 表示今天有 x 枚金币时,明天最多能拥有的金币数
// 只需计算到当前 money 即可,但为安全可开到 MAX_MONEY
vector<int> dp(MAX_MONEY + 1);
for (int x = 0; x <= money; ++x) {
dp[x] = x; // 初始:不买任何纪念品,明天还是 x 金币
}
// 对每种纪念品做完全背包
for (int j = 0; j < N; ++j) {
int cost = price[i][j];
int value = price[i + 1][j];
// 如果明天卖不出更高价,买了会亏或不赚,跳过(可选优化)
if (value <= cost) continue;
// 完全背包:从小到大遍历
for (int x = cost; x <= money; ++x) {
// 用 x - cost 金币做最优投资,再花 cost 买一个 j,明天得 value
if (dp[x - cost] + value > dp[x]) {
dp[x] = dp[x - cost] + value;
}
}
}
// 更新总金币为明天的最大值
money = dp[money];
}
cout << money << endl;
return 0;
}
这里空空如也


有帮助,赞一个