• SSL 2291——分组背包


    Description

    有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。这些物品被划分为若干组,每组中的物品互相冲突,最多选一件。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。

    Input

    第一行:三个整数,v(背包容量,v<=200),n(物品数量,n<=30)和t(最大组号,t<=10);
    第2..n+1行:每行三个整数wi,ci,p,表示每个物品的重量、价值、所属组号。

    Output

    仅一行,一个数,表示最大总价值。

    Sample Input

    10 6 3
    2 1 1
    3 3 1
    4 8 2
    6 9 2
    2 8 3
    3 9 3
    Sample Output

    20


    先将每个物品按组分好
    设f[i]为用i容量的最大价值
    f[j]:=max(f[j],f[j-w[a[k,i]]]+c[a[k,i]]);


    代码如下:

    var  
      w,c:array[1..1000] of longint;  
      f:array[0..1000] of longint;  
      a:array[1..100,0..1000] of longint;  
      v,n,t,p,i,j,k,m:longint;  
    function max(a,b:longint):longint;  
      begin  
        if a>b then exit(a)  
               else exit(b);  
      end;  
    begin  
      readln(v,n);  
      m:=0;  
      for i:=1 to n do  
        begin  
          readln(w[i],c[i],p);  
          inc(a[p,0]);  
          a[p,a[p,0]]:=i;  
          m:=max(m,p);  
        end;  
      for k:=1 to m do  
        for j:=v downto 0 do  
          for i:=1 to a[k,0] do  
            if j>=w[a[k,i]] then f[j]:=max(f[j],f[j-w[a[k,i]]]+c[a[k,i]]);  
      writeln(f[v]);  
    end.
  • 相关阅读:
    【noip模拟赛10】奇怪的贸易 高精度
    【noip模拟赛8】魔术棋子
    【noip模拟赛7】足球比赛 树
    P2502 [HAOI2006]旅行 并查集
    python发邮件:
    读取excel表格.py
    allure的其他参数
    生成allure测试报告:
    Java
    调用阿里云接口实现短信消息的发送源码——CSDN博客
  • 原文地址:https://www.cnblogs.com/Comfortable/p/8412314.html
Copyright © 2020-2023  润新知