题目链接:

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;
}
posted on 2021-12-03 16:28  Hamine  阅读(115)  评论(0编辑  收藏  举报