SSL P2698 打包

本文详细解析了一个经典的背包问题,包括题目背景、数据规模说明及动态规划解法。通过三维数组f[k,i,j]来记录前k个物品使用i的重量与j的体积能达到的最大完美值,实现了高效的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目大意:
你有一个最大能承受重量V和最大装载体积G,以及N件物品,每件物品都有一个完美值Ti、重量Vi和体积Gi,求背包装物品能得到的最大完美值是多少。

对于20%的数据 N,V,G,Ti,Vi,Gi≤10
对于50%的数据 N,V,G,Ti,Vi,Gi≤100
对于80%的数据 N,V,G,Ti,Vi,Gi≤300
80%到100%的数据是N,V,G,Ti,Vi,Gi≤380 的离散随机数据。

题解:
这题其实就是个背包,没什么好说的,应该都知道。。。
我们设f[k,i,j]表示前k个物品我们使用了i的重量j的体积所能得到的完美值最大是多少。
然后DP就很明显了:
f[k,i,j]=f[k-1,i,j]
若i>=vi,j>=gi 则
f[k,i,j]=max(f[k,i-vi,j-gi]+t,f[k-1,i,j])
然后我们要优美的,可以去优化掉k的这一维数组
时间复杂度:O(NVG)

var
   f:Array [0..381,0..381] of longint;
   p,n,m,i,j,k,t,v,g,ans:longint;

function max(aa,bb:longint):longint;
begin
   if aa>bb then exit(aa);
   exit(bb);
end;

begin
   assign(input,'pack.in'); reset(input);
   assign(output,'pack.out');rewrite(output);
   readln(n,m);
   readln(p);
   for k:=1 to p do
   begin
        readln(t,v,g);
        for i:=n downto v do
          for j:=m downto g do
              f[i,j]:=max(f[i,j],f[i-v,j-g]+t);
   end;
   writeln(f[n,m]);
   close(input); close(output);
end.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值