• 打包


    Description

    你现在拿到了许多的礼物,你要把这些礼物放进袋子里。你只有一个最多装下V 体积物品的袋子,你不能全部放进去。你也拿不动那么重的东西。你估计你能拿的最大重量为 G。现在你了解了每一个物品的完美值、重量和体积,你当然想让袋子中装的物品的完美值总和最大,你又得计划一下了。

    Input

    第一行:V 和 G 表示最大重量和体积。
    第二行:N 表示拿到 N 件礼物。
    第三到N+2行:每行3个数 Ti Vi Gi 表示各礼物的完美值、重量和体积

    Output

    输出共一个数,表示可能获得的最大完美值。

    Sample Input

    6 5
    4
    10 2 2
    20 3 2
    40 4 3
    30 3 3

    Sample Output

    50

    Hint

    对于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(x,y:longint):longint;
    begin
    if x>y then exit(x);
    exit(y);
    end;

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

  • 相关阅读:
    安装VMtools vim编辑器的使用 压缩包命令 Linux下的用户管理 (第三天)
    VM虚拟机安装 常用Linux命令 网卡配置 (第二天)
    数据库的交互模式 常用的dos命令 (第一天)
    Validate US Telephone Numbers FreeCodeCamp
    Arguments Optional FreeCodeCamp
    Everything Be True FreeCodeCamp
    Binary Agents FreeCodeCamp
    Steamroller FreeCodeCamp
    Drop it FreeCodeCamp
    Smallest Common Multiple FreeCodeCamp
  • 原文地址:https://www.cnblogs.com/YYC-0304/p/9500055.html
Copyright © 2020-2023  润新知