洛谷P2760 科技庄园
这道题是真正的一道好题呀!
这道题是一道隐蔽的多重背包,如果没发现很容易写成跑图类DP……就像我一样
每个点能摘的桃子数是这个点的价值,这个点离原点的距离的2倍是这个点的体积(因为要会来),然后可以摘的次数是这个点的件数。这样,我们把每个点跑一遍多重背包就出来了。这里的时间和体力其实是一样的,把它们去min当成背包容量就行了。
但是:
回来的时候体力不能为0!!!
AC代码:
#include<bits/stdc++.h>
using namespace std;
int n,m,s,r,W,a[210][210],b[210][210],c[20101],f[21100],t[21010],w[20110],p;
int main()
{
cin>>n>>m>>s>>r;
W=min(s,r-1);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>a[i][j];
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>b[i][j];
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(a[i][j]>0&&b[i][j]>0)
{
w[++p]=(i+j)*2;
c[p]=a[i][j];
t[p]=b[i][j];
}
for(int i=1;i<=p;i++)
for(int k=1;k<=t[i];k++)
for(int j=W;j>=w[i];j--)
f[j]=max(f[j],f[j-w[i]]+c[i]);
cout<<f[W];
return 0;
}