题目描述
设有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.
别问我是怎么做出来的…