【Nov 8 P4,多重背包】宝物筛选

 

  
    
【题目描述】
终于,破解了千年的难题。小FF 找到了王室的宝物室,里面堆满了无数价值连城的宝物……这下小FF 
可发财了,嘎嘎。但是这里的宝物实在是太多了,小FF 的采集车似乎装不下那么多宝物。看来小FF 只能
含泪舍弃其中的一部分宝物了……小FF 对洞穴里的宝物进行了整理,他发现每样宝物都有一件或者多件。他
粗略估算了下每样宝物的价值,之后开始了宝物筛选工作:小FF 有一个最大载重为W 的采集车, 洞穴里
总共有n 种宝物的,每种宝物的价值为v [i], 重量为w[i], 每种宝物有m[i]件。小FF 希望在采集车
不超载的前提下,选择一些宝物装进采集车,使得它们的价值和最大。
【输入格式】
第一行为2 整数N 和W,分别表示宝物种数和采集车的最大载重。
接下来n 行每行三个整数, 其中第i 行第一个数表示第i 类品价值, 第二个整数表示一件该类物品
的重量, 第三个整数为该类物品数量。
【输出格式】
输出仅一个整数ans, 表示在采集车不超载的情况下收集的宝物的最大价值。
【输入样例】
4 20
3 9 3
5 9 1
9 4 2
8 1 3
【输出样例】
47
【数据范围】
对于30
% 的数据: n <= Σm[i] <= 10 ^ 4 ; 0 <= W <= 10 ^ 3 .
对于100
% 的数据: n <= Σm[i] <= 10 ^ 5 ; 0 <= W <= 4 * 10 ^ 4 ;
1 <= n <= 100 .

 

      没什么好说的,就是多重背包。详细介绍请看背包九讲,找到了一个写得比较清楚的链接:http://www.cnblogs.com/asuran/archive/2009/10/12/1581667.html

 

参考代码:

 

program treasure;

  var

    n,va:longint;

    i,j,k:longint;

    v,w:array[1..100,-1..20]of longint;

    t:array[0..100]of longint;

    f:array[0..100005]of longint;

  procedure transform(x:integer);

    var

      i,p,num:integer;

    begin

      i:=1;

      p:=1;

      num:=t[x];

      while num>=p do  //分装物品

        begin

          inc(v[x,0]);

          v[x,v[x,0]]:=p*v[x,-1];

          w[x,v[x,0]]:=p*w[x,-1];

          num:=num-p;

          p:=p*2;

        end;

      if num>0 then

        begin

          inc(v[x,0]);

          v[x,v[x,0]]:=num*v[x,-1];

          w[x,v[x,0]]:=num*w[x,-1];

        end;

    end;

  begin

    readln(n,va);

    for i:=1 to n do

      readln(w[i,-1],v[i,-1],t[i]);

    for i:=1 to n do

      transform(i);

    for i:=1 to n do  //01背包

      for j:=1 to v[i,0] do

        for k:=va downto v[i,j] do

          if f[k]<f[k-v[i,j]]+w[i,j] then

            f[k]:=f[k-v[i,j]]+w[i,j];

    writeln(f[va]);

  end.

 

本文地址:http://www.cnblogs.com/saltless/archive/2010/11/10/1873235.html

(saltless原创,转载请注明出处)

 

 

你可能感兴趣的:(背包)