You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

55 lines
2.0 KiB

2 years ago
#include <bits/stdc++.h>
using namespace std;
// http://www.it61.cn/events/3758.html
/**
-----------------------------------------------------------
M M
N N
Wi M
Vi -
:
*/
int T, N, M;
int f[10001]; //dp表
int p[101][10001];//第一维表示是第几天,第二维表示是哪个纪念品,值表示是当天这个纪念品多少钱
int main() {
//输入+输出重定向
freopen("../1298.txt", "r", stdin);
cin >> T >> N >> M; //T:天数N:纪念品种类 M:小伟现在拥有的金币数量
//循环读入每一天,每一种纪念品的价格到数组中
for (int i = 1; i <= T; ++i) {
for (int j = 1; j <= N; ++j) {
cin >> p[i][j];
}
}
for (int i = 2; i <= T; i++) { //从第2天起到第T天止,因为第一天就算是买了再卖了,也是赚不到钱的
//每一天都需要清空dp表一次
memset(f, 0, sizeof(f));
//下面是一个标准的完全背包,就是物品没有个数限制,但背包容量上限是固定的。
//占用资源数= price[i-1][j]
//获得的利益= 今天的价格 - 前一天的价格=price[i][j] - price[i - 1][j]
for (int j = 1; j <= N; j++) { //遍历每一种纪念品
for (int k = p[i - 1][j]; k <= M; k++) { //构建DP表完全是按照完全背包的模板来写的代码,参照1297.cpp
f[k] = max(f[k], f[k - p[i - 1][j]] + p[i][j] - p[i - 1][j]);
}
}
//最大利润合计(dp[M]里面保存的,其实就是当天的最大收益)
//cout << "dp[M]=" << dp[M] << ",M=" << M << endl;
M += f[M];
}
cout << M << endl;
//关闭文件
fclose(stdin);
return 0;
}