题目链接:
https://www.luogu.com.cn/problem/P5662
题目大意:
小伟知道在未来 t 天 n 种纪念品每天的价格(即购买一个该纪念品所需的金币以及卖出一个该纪念品获得的金币),小伟当前有 m 枚金币。
每天小伟可以进行无数次交易,每次交易可以任选一个纪念品,以当日的价格卖出或者买进。小伟一定会在第 t 天卖出所有纪念品。求 t 天后,小伟最多能获得多少金币。
思路:
首先,可以将整个过程按照天划分为 t 个阶段,那么就可以进行 dp,因为交易可以进行无限次,可以想到完全背包。
我们可以定义一些状态,当天拥有的金币数量就是背包的容量,当天的物品的价格就是物品的价值,前一天物品的价格就是物品的重量。
代码:
#include <bits/stdc++.h>
using namespace std;
#define LL long long
const int N = 105;
const int NP = 1e4 + 10;
LL t, n, m, num[N][N], dp[NP];
int main(){
cin >> t >> n >> m;
for (int i = 1; i <= t; i++)
for (int j = 1; j <= n; j++)
scanf("%lld", &num[i][j]);
for (int i = 2; i <= t; i++){
memset(dp, 0,sizeof(dp)); //每天的能获得的钱要重新计算
for (int j = 1; j <= n; j++)
for (int k = num[i - 1][j]; k <= m; k++)
dp[k] = max(dp[k], dp[k - num[i - 1][j]] - num[i - 1][j] + num[i][j]);
m += dp[m]; //因为每天能获得的钱不同,背包大小会改变,所以要更新背包的大小
}
cout << m << "\n";
return 0;
}