zoukankan      html  css  js  c++  java
  • 打包

    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.

  • 相关阅读:
    Linux makefile 教程 很具体,且易懂
    Java串口通信具体解释
    今年股票注定有一波行情(重申6月10号的观点)
    hotmail邮箱pop3server设置方法
    html的下拉框的几个基本使用方法
    第1次实验——NPC问题(回溯算法、聚类分析)
    【甘道夫】Hive 0.13.1 on Hadoop2.2.0 + Oracle10g部署详细解释
    C该程序生成一个唯一的序列号
    高速分拣(1)的基本算法
    Eclipse项目崩溃,使用MyEclipse解决
  • 原文地址:https://www.cnblogs.com/YYC-0304/p/9500055.html
Copyright © 2011-2022 走看看