版权声明:原创,勿转 https://blog.csdn.net/qq_42386465/article/details/82776991
Life种了一块田,里面种了有一些桃树。
Life对PFT说:“我给你一定的时间去摘桃,你必须在规定的时间之内回到我面前,否则你摘的桃都要归我吃!”
PFT思考了一会,最终答应了!
由于PFT的数学不好!它并不知道怎样才能在规定的时间获得最大的价值,
由于PFT不是机器人,所以他的体力并不是无限的,他不想摘很多的桃以至体力为0,而白白把桃给Life。同时PFT每次只能摘一棵桃树,,每棵桃树都可以摘K次(对于同一棵桃每次摘的桃数相同)。每次摘完后都要返回出发点(PFT一次拿不了很多)即Life的所在地(0,0){试验田左上角的桃坐标是(1,1)}。
PFT每秒只能移动一个单位,每移动一个单位耗费体力1(摘取不花费时间和体力,但只限上下左右移动)
https://www.luogu.org/problemnew/show/P2760
这题真是厉害!!!
这题乍一看像是个二维背包;但发现每次采摘都要回起点,且每个树可以采好几次;好像是个01背包哈哈。
那么物品体积就是从起点到这个点的距离*2,就是(i+j)*2;
每件物品的价值就是桃子数量;
物品数量就是所有桃树可采摘次数之和;
#include <iostream>
#include <cstdio>
using namespace std;
int n,m,t,tl;
int a[1101][1101],b[1101][1101];
int w[1110001],v[1100001],f[11001];
int num=0;
int main()
{
cin>>n>>m>>t>>tl;
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];
if(a[i][j]>0){
for(int k=1;k<=b[i][j];k++){
w[++num]=2*(i+j);
v[num]=a[i][j];
}
}
}
}
t=min(tl-1,t);
f[0]=0;
for(int i=1;i<=num;i++){
for(int j=t;j>=w[i];j--){
if(j-w[i]<0) break;
else f[j]=max(f[j],f[j-w[i]]+v[i]);
}
}
cout<<f[t];
return 0;
}