【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原创,转载请注明出处)

 

 

posted on 2010-11-10 07:07  saltless  阅读(561)  评论(0编辑  收藏  举报

导航