P2760 科技庄园

题目背景

Life种了一块田,里面种了有一些桃树。

Life对PFT说:“我给你一定的时间去摘桃,你必须在规定的时间之内回到我面前,否则你摘的桃都要归我吃!”

PFT思考了一会,最终答应了!

由于PFT的数学不好!它并不知道怎样才能在规定的时间获得最大的价值,

由于PFT不是机器人,所以他的体力并不是无限的,他不想摘很多的桃以至体力为0,而白白把桃给Life。同时PFT每次只能摘一棵桃树,,每棵桃树都可以摘K次(对于同一棵桃每次摘的桃数相同)。每次摘完后都要返回出发点(PFT一次拿不了很多)即Life的所在地(0,0){试验田左上角的桃坐标是(1,1)}。

PFT每秒只能移动一个单位,每移动一个单位耗费体力1(摘取不花费时间和体力,但只限上下左右移动)。

题目描述

输入输出格式

输入格式:

 

第一行:四个数为N,M,TI,A 分别表示试验田的长和宽,Life给PFT的时间,和PFT的体力。

下面一个N行M列的矩阵桃田。表示每次每棵桃树上能摘的桃数。

接下来N行M列的矩阵,表示每棵桃最多可以采摘的次数K。

 

输出格式:

 

一个数:PFT可以获得的最大的桃个数。

 

输入输出样例

输入样例#1: 复制

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

输出样例#1: 复制

10

说明

样例说明:

可以摘到1次(1,1)和1次(2,3),体力和时间不满足再摘桃了。

范围:

对于M,N,TI,A 10<=30%<=50 10<=100%<=100

对于K 10<=100%<=100

保证结果在long int范围内

思路:显然是背包问题,但是是怎么算的呢?就是01背包,可以将反复拿的桃子看成是不同的东西存起来啦,比较像图里面前向星的储存。动态规划专属题目。

code:

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>

using namespace std;
const int N=1005;
int n,m,t,a,x;
int f[N*N],c[N*N],w[N*N],g[N][N],ne=0;
int read()
{
	int ans=0,f=1;
	char c;
	c=getchar();
	while(c<'0'||c>'9')
	{
		if(c=='-')
		f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9')
	{
		ans=ans*10+c-'0';
		c=getchar();
	}
	return ans*f;
}
int main()
{
	freopen("51.in","r",stdin);
	freopen("51.out","w",stdout);
	n=read();
	m=read();
	t=read();
	a=read();
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			g[i][j]=read();//原始输入数组
		}
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			x=read();//看看每个桃子可以摘几下
			if(g[i][j]>0)//如果可以摘
			{
				for(int l=1;l<=x;l++)
				{
					c[++ne]=(i+j)*2;//付出代价
					w[ne]=g[i][j];//获得价值
				}
			}
		}
	}
	t=min(t,a-1);//注意a-1,因为体力值不能为0
//	cout<<ne<<endl;
	for(int i=1;i<=ne;i++)
	{
		for(int j=t;j>=c[i];j--)
		{
			if(j-c[i]<0)
			break;
			else
			f[j]=max(f[j],f[j-c[i]]+w[i]);
		}
	}
	printf("%d\n",f[t]);
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值