P2347 砝碼稱重
阿新 • • 發佈:2018-12-07
題目描述
設有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.
別問我是怎麼做出來的…