Description
设有1g、2g、3g、5g、10g、20g的砝码各若干枚(其总重<=1000),
要求: 输入方式:a1 a2 a3 a4 a5 a6 (表示1g砝码有a1个,2g砝码有a2个,…,20g砝码有a6个) 输出方式:N (N表示用这些砝码能称出的不同重量的个数,但不包括一个砝码也不用的情况)Input
Output
Sample Input
1 1 0 0 0 0
(注:下划线表示空格) Sample Output3 表示可以称出1g,2g,3g三种不同的重量。
最大只能为1000,
状态转移方程: f[j]:=max(f[j-k*v[i]]+k*v[i],f[j]); 1<=i<=6 1<=j<=1000 1<=k<=a[i]代码如下:
const v:array[1..6] of longint=(1,2,3,5,10,20);var f,a:array[0..1000] of longint; w:array[0..1000] of boolean; i,j,k,n,total:longint;function max(a,b:longint):longint; begin if a>b then exit(a) else exit(b);end;begin for i:=1 to 6 do read(a[i]); for i:=1 to 6 do for j:=1000 downto 1 do for k:=1 to a[i] do if j>=v[i]*k then begin f[j]:=max(f[j-k*v[i]]+k*v[i],f[j]); w[f[j]]:=true; end; for i:=1 to 1000 do if w[i] then inc(total); writeln(total);end.