合肥
合肥奥数网

合肥站
奥数网

信息学竞赛常用算法与策略:贪心策略(2)

合肥奥数网整理 2013-01-18 14:28:18

  7.3 典型例题与习题

   例4:背包问题:

  有一个背包,背包容量是M=150。有7个物品,物品可以分割成任意大小。

  要求尽可能让装入背包中的物品总价值最大,但不能超过总容量。

 

物品

A

B

C

D

E

F

G

重量

35

30

60

50

40

10

25

价值

10

40

30

50

35

40

30

  分析:

  目标函数: ∑pi最大

  约束条件是装入的物品总重量不超过背包容量:∑wi<=M( M=150)

  (1)根据贪心的策略,每次挑选价值最大的物品装入背包,得到的结果是否最优?

  (2)每次挑选所占空间最小的物品装入是否能得到最优解?

  (3)每次选取单位容量价值最大的物品,成为解本题的策略。

  程序如下:

  program beibao;

  const

    m=150;

    n=7;

  var

    xu:integer;

    i,j:integer;

    goods:array[1..n,0..2] of integer;

    ok:array[1..n,1..2] of real;

  procedure init;

    var

      i:integer;

    begin

      xu:=m;

      for i:=1 to n do

        begin

          write('Enter the price and weight of the ',i,'th goods:');

          goods[i,0]:=i;

          read(goods[i,1],goods[i,2]);

          readln;

          ok[i,1]:=0; ok[i,2]:=0;

        end;

    end;

  procedure make;

    var

      bi:array[1..n] of real;

      i,j:integer;

      temp1,temp2,temp0:integer;

    begin

      for i:=1 to n do

        bi[i]:=goods[i,1]/goods[i,2];

      for i:=1 to n-1 do

        for j:=i+1 to n do

          begin

            if bi[i]<bi[j] then begin

               temp0:=goods[i,0]; temp1:=goods[i,1]; temp2:=goods[i,2];

               goods[i,0]:=goods[j,0]; goods[i,1]:=goods[j,1]; goods[i,2]:=goods[j,2];

               goods[j,0]:=temp0; goods[j,1]:=temp1; goods[j,2]:=temp2;

            end;

          end;

    end;

  begin

    init;

    make;

    for i:=1 to 7 do

      begin

        if goods[i,2]>xu then break;

        ok[i,1]:=goods[i,0]; ok[i,2]:=1;

        xu:=xu-goods[i,2];

      end;

    j:=i;

    if i<=n then

      begin

        ok[i,1]:=goods[i,0];

        ok[i,2]:=xu/goods[i,2];

      end;

    for i:=1 to j do

        writeln(ok[i,1]:1:0,':',ok[i,2]*goods[i,2]:2:1);

  end.

首页 上一页 下一页 尾页

相关推荐

点击查看更多
重点初中
首页 导航