0
点赞
收藏
分享

微信扫一扫

Luogu P2760 科技庄园


题目链接:​​传送门​​

把在每个坐标的物品赋上价值和重量
重量就是,也就是来回需要的时间
把每个物品二进制拆分
最后做一遍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;
}


举报

相关推荐

0 条评论