科技庄园

Problem Description

Life种了一块田,里面种了有一些桃树。
Life对PFT说:“我给你一定的时间去摘桃,你必须在规定的时间之内回到我面前,否则你摘的桃都要归我吃!”
PFT思考了一会,终于答应了!
由于PFT的数学不好,他并不知道怎样才能在规定的时间获得最大的价值。
由于PFT不是机器人,所以他的体力并不是无限的,他不想摘很多的桃以至体力为0,而白白把桃给Life。同时PFT每次只能摘一棵桃树,每棵桃树都可以摘K次(对于同一棵桃树每次摘的桃数相同)。每次摘完后都要返回出发点(PFT一次拿不了很多),即Life的所在地(0,0){试验田左上角的桃坐标是(1,1)}。
PFT每秒只能移动一个单位,每移动一个单位耗费体力1(摘取不花费时间和体力,但只限上下左右移动)。

Input

输入有多组数据,每组数据第1行四个数为N,M,T1,A(10<=N,M,T1,A<=100)分别表示试验田的长和宽,Life给PFT的时间和PFT的体力。
下面一行N行M列的矩阵桃田,表示每次每棵桃树上能摘的桃数。
接下来N行M列的矩阵,表示每棵桃树最多可以采摘的次数K(10<=K<=100)。

Output

对于每组数据输出一个数,PFT可以获得的最大的桃个数。

Sample Input

4 4 13 20
10 0 0 0
0 0 10 0
0 0 10 0
0 0 0 0
1 0 0 0
0 0 2 0
0 0 4 0
0 0 0 0

Sample Output

10

Hint
可以摘到1次(1,1)。
#include<stdio.h>
#include<string.h>
int N,M,times,strength,pitch[110][110],pick[110][110],dp[110][110];
int main()
{
	//freopen("b.txt","r",stdin);
	while(scanf("%d %d %d %d",&N,&M,×,&strength)==4)
	{
		memset(dp,0,sizeof(dp));
		int i,j,k,l,ans,p;
		for(i=1;i<=N;i++)
			for(j=1;j<=M;j++)
				scanf("%d",&pitch[i][j]);
			for(i=1;i<=N;i++)
				for(j=1;j<=M;j++)
					scanf("%d",&pick[i][j]);
				for(i=1;i<=N;i++)
					for(j=1;j<=M;j++)
					{
						ans=pick[i][j];
						for(l=1;l<=ans;l++)
						{
							for(k=times;k>=2*(i+j);k--)
								for(p=strength-1;p>=2*(i+j);p--)
								{
									if(dp[k][p]<dp[k-2*(i+j)][p-2*(i+j)]+pitch[i][j])
										dp[k][p]=dp[k-2*(i+j)][p-2*(i+j)]+pitch[i][j];
								}
						}
					}
					printf("%d\n",dp[times][strength-1]);
	}
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值