1. 程式人生 > >P2347 砝碼稱重

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.

別問我是怎麼做出來的