I and OI
Past...

题意:有6种面值的货币,保证最小面值是1.可加可减,求出分别组成1~100金额的最少货币数.

并求出它们的平均值和最大值.

分析:有负权的完全背包,下界开大,注意处理负权即可.

code:

const oo=33686018;
      maxn=20000;
var   datanum,d,o,i,j,ans,max:longint;
      a:array[1..6] of longint;
      f:array[0..maxn] of longint;

      function min(a,b:longint):longint;
      begin
            if a>b then exit(b); exit(a);
      end;

begin
      readln(datanum);
      for d:=1 to datanum do
      begin
            for o:=1 to 6 do read(a[o]);
            readln;
            fillchar(f,sizeof(f),2);
            f[10000]:=0;
            for i:=1 to 6 do
            begin
                  for j:=a[i] to maxn do
                  if f[j-a[i]]<>oo then
                    f[j]:=min(f[j],f[j-a[i]]+1);
                  for j:=maxn-a[i] downto 0 do
                  if f[j+a[i]]<>oo then
                    f[j]:=min(f[j],f[j+a[i]]+1);
            end;
            ans:=0; max:=0;
            for o:=10001 to 10100 do
            begin
                  ans:=ans+f[o];
                  if f[o]>max then max:=f[o];
            end;
            writeln(ans/100:0:2,' ',max);
      end;
end.

posted on 2011-08-10 15:02  exponent  阅读(419)  评论(0编辑  收藏  举报