特长生模拟 采药(dp,背包)

来源:互联网 发布:拼音域名 编辑:程序博客网 时间:2024/05/21 06:57

题1、采药

问题描述
凡凡是个聪明的孩子,今天他也要去采药,但是这次和聪聪不一样,他采的药是密度很大的,所以不仅要求背包的总空间V能放得下所采的药,还要求药草的总质量不能超过凡凡所能承受的范围M。
由于凡凡运动力惊人并且拥有敏锐的察觉力,所以他能发现N种珍惜的药材,对于每个药材凡凡都会精准地目测出其质量、体积和价值,现在要你做出一些取舍,使凡凡所能采到的药材的总价值最大。
注意:每种药材只有一个。
问题输入
第一行有三个整数M、V、N。
接下来有N行,每行三个整数,分别表示一种药材的质量、体积、价值。
问题输出
一行一个数,表示能获得的最大价值。

分析:一看就知道是个二维费用背包,f[j,k]表示质量为j,体积为k时的最大价值,f[j,k]=max(f[j,k],f[j-m[i],k-v[i]]+c[i])

代码

const  maxn=1000;var  a,b,c:array[0..maxn] of longint;  f:array[0..maxn,0..maxn] of int64;  i,j,k,n,m,v:longint;function max(x,y:int64):int64;begin  if x>y then exit(x) else exit(y);end;begin  assign(input,'medic.in');reset(input);  assign(output,'medic.out');rewrite(output);  readln(m,v,n);  for i:=1 to n do    readln(a[i],b[i],c[i]);  for i:=1 to n do    for j:=m downto a[i] do      for k:=v downto b[i] do        f[j,k]:=max(f[j,k],f[j-a[i],k-b[i]]+c[i]);  writeln(f[m,v]);  close(input);close(output);end.