题解:P4912 帕秋莉的魔法
huangjiayi2024 · · 题解
题目简化
给定一个容积为
题目分析
这道题很显然是个背包,但是貌似多加了个
但是值得注意的是,题目说的是
Code
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 50 + 10, p = 2501; // 偏移量
int n, m, a[N], b[N], dp[N][p * 2 + 10], w[N][N]; // 不要开小了
int main() {
ios::sync_with_stdio(0); cin.tie(0), cout.tie(0);
cin >> n >> m;
for (int i = 1; i <= n; i++) cin >> a[i] >> b[i];
for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) cin >> w[j][i];
memset(dp, -0x3f, sizeof dp);
dp[0][p] = 0; // 不要初始化错了
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= 5001; j++)
for (int k = 0; k < i; k++)
if ((j - a[i]) >= 0 && (j - a[i]) <= 5001) // 防止越界
dp[i][j] = max(dp[i][j], dp[k][j - a[i]] + b[i] + w[i][k]); // 转移
} int ans = dp[0][0];
for (int i = 1; i <= n; i++) ans = max(ans, dp[i][m + p]); // 这里不要忘
if (ans <= dp[0][0] / 2) cout << -1; // -1 也不要忘了输出
else cout << ans;
return 0;
}