这道题是道巧妙的思路题,要想到每天即使拿手里也可以当作全卖了再当天全买了。这样就相当于转换成了T-1天个完全背包问题,背包容量为金钱数,背包最大价值为所有物品下一天与今天物品价值差的和。
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <set>
#include <cmath>
using namespace std;
inline int read()
{
int x = 0, y = 1; char c = getchar();
while (c>'9' || c<'0'){ if (c == '0')y = -1; c = getchar(); }
while (c >= '0'&&c <= '9'){ x = x * 10 + c - '0'; c = getchar(); }
return x*y;
}
int t, m, n;
int p[105][105];
int val[100005];
int main()
{
cin >> t >> n >> m;
for (int i = 1; i <= t; ++i)
{
for (int j = 1; j <= n; ++j)
{
p[i][j] = read();
}
}
//完全背包
for (int i = 1; i < t; ++i)
{
memset(val, 0, sizeof(val));
for (int j = 1; j <= n; ++j)
{
for (int k = p[i][j]; k <= m; ++k)
{
val[k] = max(val[k], val[k - p[i][j]] + p[i + 1][j] - p[i][j]);
}
}
m = max(m, val[m] + m);
}
cout << m;
return 0;
}