SSL_1558 科技庄园

来源:互联网 发布:护肤品网络推广的目的 编辑:程序博客网 时间:2024/04/29 02:42

Description

Life是河北衡水中学的学生,他是一个道德极高的学生,他积极贯彻党的十七大精神,积极走可持续发展道路,在他的不屑努力下校领导终于决定让他在衡中的一片闲杂地里种桃,以亲身实践种田的乐趣,厉行节约,告诉人们节约的重要性!
春华秋实,在这个金秋的季节,Life带者他的宠物——PFT到了他的试验田,当他看见自己的辛勤成果时,心里是那个高兴啊!
这时Life对他的宠物PFT说:“你想不想吃桃啊?”
PFT兴奋的说:“好啊!”
Life说:“好吧,但是我只给你一定的时间,你必须在规定的时间之内回到我面前,否则你摘的桃都要归我吃!”
PFT思考了一会,最终答应了!
由于PFT的数学不好!它并不知道怎样才能在规定的时间获得最大的价值,但你是一个好心人,如果你帮助它,你的RP一定会暴涨的!
对于这个可以RP暴涨机会,你一定不会错过的是不是?
由于PFT不是机器人,所以他的体力并不是无限的,他不想摘很多的桃以至体力为0,而白白把桃给Life。同时PFT每次只能摘一棵桃树,摘桃花费时间体力,每棵桃树都可以摘K次(对于同一棵桃每次摘的桃数相同)。每次摘完后都要返回出发点(PFT一次拿不了很多)即Life的所在地(0,0){试验田左上角的桃坐标是(1,1)}。
PFT每秒只能移动一个单位,每移动一个单位耗费体力1(摘取不花费时间和体力,但只限上下左右移动)。

Input

第一行:四个数为N,M,TI,A 分别表示试验田的长和宽,Life给PFT的时间,和PFT的体力。
下面一个N行M列的矩阵桃田。表示每次每棵桃树上能摘的桃数。
接下来N行M列的矩阵,表示每棵桃最多可以采摘的次数K。

思路:

    这就是一个多重背包,用w[i]表示当前回到起点的距离,ts[i]表示桃子个数,可得动态转移方程:
f[j]=max(f[j],f[j-k*w[i]]+ts[i]*k。

代码:

#include<cstdio>int n1,n,m,t,sj,ts[10001],cs[10001],f[1001],w[10001];int min(int x,int y){return x<y?x:y;}int max(int x,int y){return x>y?x:y;}int main(){scanf("%d%d%d%d",&n,&m,&sj,&t);n1=0;t=min(sj,t-1);//取时间和体力中最小的一个,体力要-1因为题目说体力为零就要给life桃子for (int i=1;i<=n*m;i++)  scanf("%d",&ts[i]);for (int i=1;i<=n*m;i++)  scanf("%d",&cs[i]);for (int i=1;i<=n;i++)  for (int j=1;j<=m;j++)    w[++n1]=(i+j)*2;//求路径,因为是往返的所以*2for (int i=1;i<=n*m;i++)  for (int j=t;j>=0;j--)    for (int k=0;k<=cs[i];k++)      {                if (j-k*w[i]<0) break;        f[j]=max(f[j],f[j-k*w[i]]+ts[i]*k);//多重背包      }printf("%d",f[t]);}