题目传送门
(dp,将矩阵的每一个格转化成一个物品,然后跑背包)
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
long long n,m,t,s,tot,c[10001],w[10001],a[10001];
long long f[101][101],ans;
int main() {
scanf("%lld%lld%lld%lld",&n,&m,&s,&t);
for(int i = 1;i <= n; i++)
for(int j = 1;j <= m; j++)
scanf("%lld",&c[++tot]);
tot = 0;
for(int i = 1;i <= n; i++)
for(int j = 1;j <= m; j++)
scanf("%lld",&a[++tot]);
tot = 0;
for(int i = 1;i <= n; i++)
for(int j = 1;j <= m; j++)
w[++tot] = (i + j) * 2;
for(int i = 1;i <= tot; i++)
for(int p = 1;p <= a[i]; p++)
for(int j = s;j >= w[i]; j--)
for(int k = t;k >= w[i]; k--) {
f[j][k] = max(f[j][k],f[j-w[i]][k-w[i]] + c[i]);
if(k == t) f[j][k] = 0;
ans = max(ans,f[j][k]);
}
printf("%lld",ans);
return 0;
}