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