科技庄园(动态规划)
2016-04-08 21:48
393 查看
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。
Output
一个数:PFT可以获得的最大的桃个数。
Sample
Input
Sample
Output
Hint
对于M N TI
A
10<=30%<=50
10<=100%<=100
对于K
10<=100%<=100
保证结果在longint范围内
解题思路:
这其实是一个多重背包。
f[j]表示前i种物品装入容量为j的背包里的最大价值,状态转移方程为:
f[j]=max{f[j],f[j-k*w[i]]+k*c[i]|j>=w[i]*k}
(1<=i<=v,t>=j>=0,0<=k<=u[i])
f[t]即为所求。
时间复杂度:O(V*∑u[i])
程序:
var
a,b:array[1..1000,1..1000] of longint;
w,c,u,f:array[0..10000]of longint;
n,m,i,j,k,v,t,p:longint;
function max(x,y:longint):longint;
begin
if x>y
then exit(x);
exit(y);
end;
begin
readln(n,m,t,p);
k:=0;
for i:=1 to n do
for j:=1 to
m do
read(a[i,j]);
for i:=1 to n do
for j:=1 to
m do
begin
read(b[i,j]);
if a[i,j]>0 then
begin
inc(k);
c[k]:=a[i,j];
u[k]:=b[i,j];
w[k]:=(i+j)*2;
end;
end;
v:=k;
for i:=1 to v do
for j:=t
downto 0 do
for k:=0 to u[i] do
if (j>=w[i]*k) then f[j]:=max(f[j],f[j-w[i]*k]+c[i]*k);
if t>=p then t:=p-1;
writeln(f[t]);
end.
版权属于: Chris
原文地址: http://blog.sina.com.cn/s/blog_83ac6af80102vjrm.html
转载时必须以链接形式注明原始出处及本声明。
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可以获得的最大的桃个数。
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 【样例解释】 可以摘到1次(1,1)和1次(2,3),体力和时间不满足再摘桃了。
Sample
Output
10
Hint
对于M N TI
A
10<=30%<=50
10<=100%<=100
对于K
10<=100%<=100
保证结果在longint范围内
解题思路:
这其实是一个多重背包。
f[j]表示前i种物品装入容量为j的背包里的最大价值,状态转移方程为:
f[j]=max{f[j],f[j-k*w[i]]+k*c[i]|j>=w[i]*k}
(1<=i<=v,t>=j>=0,0<=k<=u[i])
f[t]即为所求。
时间复杂度:O(V*∑u[i])
程序:
var
a,b:array[1..1000,1..1000] of longint;
w,c,u,f:array[0..10000]of longint;
n,m,i,j,k,v,t,p:longint;
function max(x,y:longint):longint;
begin
if x>y
then exit(x);
exit(y);
end;
begin
readln(n,m,t,p);
k:=0;
for i:=1 to n do
for j:=1 to
m do
read(a[i,j]);
for i:=1 to n do
for j:=1 to
m do
begin
read(b[i,j]);
if a[i,j]>0 then
begin
inc(k);
c[k]:=a[i,j];
u[k]:=b[i,j];
w[k]:=(i+j)*2;
end;
end;
v:=k;
for i:=1 to v do
for j:=t
downto 0 do
for k:=0 to u[i] do
if (j>=w[i]*k) then f[j]:=max(f[j],f[j-w[i]*k]+c[i]*k);
if t>=p then t:=p-1;
writeln(f[t]);
end.
版权属于: Chris
原文地址: http://blog.sina.com.cn/s/blog_83ac6af80102vjrm.html
转载时必须以链接形式注明原始出处及本声明。
相关文章推荐
- 打包(动态规划)
- 打包(动态规划)
- 暗黑游戏(动态规划)
- 暗黑游戏(动态规划)
- 逃亡的准备(动态规划)
- 逃亡的准备(动态规划)
- 最小乘车费用(动态规划)
- 最小乘车费用(动态规划)
- 1996年分区联赛提高组之四&nbsp;砝码称…
- 1996年分区联赛提高组之四&nbsp;砝码称…
- 竞赛总分(动态规划)
- 竞赛总分(动态规划)
- 2006年分区联赛提高组之二&nbsp;金明的…
- 2006年分区联赛提高组之二&nbsp;金明的…
- USACO&nbsp;2.3&nbsp;货币系统
- USACO&nbsp;2.3&nbsp;货币系统
- 分组背包(动态规划)
- 分组背包(动态规划)
- 潜水员(动态规划)
- 潜水员(动态规划)