您的位置:首页 > 其它

[DP]科技庄园

2017-04-26 16:00 204 查看
题目描述

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。

Output

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

分析

刚拿到题目——这题目咋那么长啊

仔细一看,还是挺简单的

看上去像是二维

可是我深入到地层内部思考1W年brabrabra

以后

我发现,其实是用背包。。。。。

把桃树的个数,可摘次数处理一下,放进数组。还有距离也储存到一维里边,就成背包了

然后DP内容也是十分的简单,方程就不列了,部分背包的做法

#include <iostream>
#include <cstdio>
using namespace std;
int n, m, t1, t2, a[101][101], b[101][101], f[10001], w[10001], v[10001], p[10001], i, j, k;
int main() {
scanf("%d%d%d%d", &n, &m, &t1, &t2);

for(i = 1; i <= n; i++)
for(j = 1; j <= m; j++)
scanf("%d", &a[i][j]);

for(i = 1; i <= n; i++)
for(j = 1; j <= m; j++) {
scanf("%d", &b[i][j]);

if(a[i][j] > 0) {
k++;
p[k] = a[i][j];
v[k] =
4000
b[i][j];
w[k] = (i + j) * 2;
}
}

n = k;

for(i = 1; i <= n; i++)
for(j = t1; j >= 1; j--)
for(k = 1; k <= v[i]; k++)
if(j >= w[i]*k) f[j] = max(f[j], f[j - w[i] * k] + p[i] * k);

if(t1 >= t2) t1 = t2 - 1;

printf("%d", f[t1]);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: