题目链接:传送门
把在每个坐标的物品赋上价值和重量
重量就是,也就是来回需要的时间
把每个物品二进制拆分
最后做一遍01背包
这里的时间和体力花费是相同的
所以取一个就好
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <complex>
#include <algorithm>
#include <climits>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <iomanip>
#define
#define
using namespace std;
typedef long long ll;
int n, m, t, c, v[B][B], w[B][B], p[B][B], V[A], W[A], P[A], cnt; ll f[A];
int main(int argc, char const *argv[]) {
cin >> n >> m >> t >> c;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
cin >> v[i][j];
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++) {
cin >> p[i][j];
int num = p[i][j];
for (int k = 1; num; k <<= 1) {
if (num < k) k = num;
num -= k;
V[++cnt] = k * v[i][j];
W[cnt] = k * 2 * (i + j);
}
}
int mm = min(t, c - 1);
for (int i = 1; i <= cnt; i++)
for (int j = mm; j >= W[i]; j--)
f[j] = max(f[j], f[j - W[i]] + V[i]);
cout << f[mm] << endl;
}