砝码称重
设有1g,2g,3g,5g,10g,20g的砝码各若干枚(其总重?1000g),要求: 输入:
a1 a2 a3 a4 a5 a6(
示1g砝码有a1个,2g砝码有a2个,......20g砝码有a6个)
输出:
Total=N (N表示用这些砝码能称出的不同重量的个数,但不包括一个砝码也不用的情况) 输入样例:1 1 0 0 0 0
输出样例:Total=3,表示可以称出1g,2g,3g三种不同的重量
题解
设
const num:array[1..6] of shortint=(1,2,3,5,10,20); ,砝码的重量序列, var
a:array[1..6] of integer; ,,种砝码的个数,
visited:array[0..1000] of boolean; ,重量的访问
序列,防止重复
,
no:array[0..1000] of integer; ,n0[0]—不同重量数;n0[j]—第j种重量(,?j?no[0]),
total,i,j,k:integer; {total—目前称出的重量}
我们按照第,种砝码,第,种砝码,……第,种砝码的顺序
。在分析第i种砝码的放置
时,依次在现有的不同重量的基础上,放,块、,块、……a[i]块,产生新的不同重量。
n0[n0[0]+1]=total?total=n0[j]+k*num[i],visited[total]=false,,?i
?6,,?j?no[0], ,?k?a[i]
阶段i: 分析第i种砝码(,?i?6);
状态j:枚举现有的不同重量(,?j?no[0]);
决策k:在现有重量的基础上放k块第i种砝码,产生重量n0[j]+k*num[i](,?k?a[i]);
计算过程如下:
fillchar(visited,sizeof(visited),false);
write(’a1-a6:’);for i?1 to 6 do read(a[i]),输入,种砝码的个数,
no[0] ?1;no[1] ?0; ,产生第,种重量,,
for i?1 to 6 do ,阶段:分析第i种砝码,
for j?1 to no[0] do ,状态:枚举现有的不同重量,
for k?1 to a[i] do ,决策:在现有重量的基础上放k块第i种砝码,
begin
total?no[j]+k*num[i]; ,产生重量,
if not visited[total] then ,若该重量未产生过,则设访问标志,
begin
visited[total] ?true;
inc(no[0]); ,新重量进入n0序列,
no[no[0]] ?total;
end;,then,
end;{for}
writeln(no[0]-1); {输出不同重量的个数}