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