10. 法国数学家梅齐亚克的砝码题目:
有位商人有40磅重的砝码,不小心摔成4块碎片.每块都是整磅数,能秤1-40之间任意重量的物品(整磅).请问四块碎片的重量各是多少?
program exExhaustive10_1;
const All = 40;
var
p1, p2, p3, p4, p1s, p2s, p3s, p4s, w : integer;
// p1 ~ p4 为4块的重量,它们可能放在被称物体一边或另一边,即既可以加这个重量也可以减这个重量,当然某块也可以不用
// p1s ~ p4s 为正负符号或零,用来分别表示某块放在被称物体一边或另一边,零表示某块未用
flag : boolean;
begin
for p1 := 1 to All do
for p2 := p1+1 to All-p1 do
for p3 := p2+1 to All-p1-p2 do
begin
p4 := All-p1-p2-p3;
if p4 > p3 then
begin
flag := true;
for w := 1 to All do
if flag then
begin
flag := false;
for p1s := -1 to 1 do
if not flag then
for p2s := -1 to 1 do
if not flag then
for p3s := -1 to 1 do
if not flag then
for p4s := -1 to 1 do
if not flag then
if w = abs(p1s*p1 + p2s*p2 + p3s*p3 + p4s*p4) then flag := true;
end;
if flag then writeln('4 pieces: ', p1, ' ', p2, ' ', p3, ' ', p4);
end;
end;
readln;
end.
program exExhaustive10_1;
const All = 40;
var
p1, p2, p3, p4, p1s, p2s, p3s, p4s, w : integer;
// p1 ~ p4 为4块的重量,它们可能放在被称物体一边或另一边,即既可以加这个重量也可以减这个重量,当然某块也可以不用
// p1s ~ p4s 为正负符号或零,用来分别表示某块放在被称物体一边或另一边,零表示某块未用
flag : boolean;
begin
for p1 := 1 to All do
for p2 := p1+1 to All-p1 do
for p3 := p2+1 to All-p1-p2 do
begin
p4 := All-p1-p2-p3;
if p4 > p3 then
begin
flag := true;
for w := 1 to All do
if flag then
begin
flag := false;
for p1s := -1 to 1 do
if not flag then
for p2s := -1 to 1 do
if not flag then
for p3s := -1 to 1 do
if not flag then
for p4s := -1 to 1 do
if not flag then
if w = abs(p1s*p1 + p2s*p2 + p3s*p3 + p4s*p4) then flag := true;
end;
if flag then writeln('4 pieces: ', p1, ' ', p2, ' ', p3, ' ', p4);
end;
end;
readln;
end.


浙公网安备 33010602011771号