POJ1252

题意:有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.

转载于:https://www.cnblogs.com/exponent/archive/2011/08/10/2133696.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值