SSL 1072——砝码称重

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 Output

3 表示可以称出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.
posted @ 2017-04-21 19:47  BEYang_Z  阅读(139)  评论(0编辑  收藏  举报