P2347 砝码称重

题目描述
设有1g1g、2g2g、3g3g、5g5g、10g10g、20g20g的砝码各若干枚(其总重 \le 1000≤1000),

输入输出格式
输入格式:
输入方式:a_1 , a_2 ,a_3 , a_4 , a_5 ,a_6a

(表示1g砝码有a_1a 个,2g砝码有a_2a 个,…,20g20g砝码有a_6a个)

输出格式:
输出方式:Total=NTotal=N
(NN表示用这些砝码能称出的不同重量的个数,但不包括一个砝码也不用的情况)

本题看似可以6重循环,于是我愉快的以为这是一道水题

var i1,i2,i3,i4,i5,i6,i:longint;
    a:array[1..6]of longint;
    b:array[0..1000000]of boolean;
    sum:longint;
begin
  for i:=1 to 6 do read(a[i]);
  for i1:=0 to a[1] do
  for i2:=0 to a[2] do
  for i3:=0 to a[3] do
  for i4:=0 to a[4] do
  for i5:=0 to a[5] do
  for i6:=0 to a[6] do
    b[i1*1+i2*2+i3*3+i4*5+i5*10+i6*20]:=true;
    for i:=1 to 1000 do
    if b[i] then inc(sum);
  write('Total=',sum);
end.

92 no

调了俩小时也没调出来…

const z:array[1..6]of longint=(1,2,3,5,10,20);
var i,j,k,max:longint;
    m,n,sum:longint;
    a:array[1..6]of longint;
    b:array[0..1000000,1..6]of longint;//重为i的质量为b[i,1]*z[1]+b[i,2]*z[2]+...+b[i,6]*z[6]
    c:array[0..1000000]of boolean;
begin
  max:=0;
  sum:=0;
  for i:=1 to 6 do
  begin
  read(a[i]);
  max:=max+a[i]*z[i];//找到最大值
  end;
  for i:=1 to max do c[i]:=false;//true代表可以做到i质量
  c[max]:=true;
  for i:=1 to 6 do b[max,i]:=a[i];
  for i:=max downto 1 do//倒推
  if c[i] then
  begin
    for j:=1 to 6 do
    if b[i,j]>0 then
    begin
      c[i-z[j]]:=true;
      for k:=1 to 6 do b[i-z[j],k]:=b[i,k];//赋值到c中
      b[i-z[j],j]:=b[i-z[j],j]-1;
    end;
  end;
  for i:=1 to max do
  if c[i] then inc(sum);
  write('Total=',sum);//输出结果
end.

别问我是怎么做出来的

猜你喜欢

转载自blog.csdn.net/sxy__orz/article/details/82810632