// Из камней весом P с индексом i (i=1..N) требуется набрать кучу весом ровно W.
// Если это невозможно, набрать максимально близкую к W (но меньшую, чем W).
// Полный перебор при N <= 30.
// Copyleft Alexey Kuzminov (c) 2016
program Stones;
const
MAX_N = 30;
type
TIndex = 0..MAX_N-1;
TStones = array [TIndex] of Integer;
var
N: Integer;
P: TStones;
i: TIndex;
W, T, tOld: LongInt;
V: LongInt;
procedure PrintSolution(const s: String);
var
k: TIndex;
begin
Write(s);
WriteLn;
// текущий вес
Write(T:4,': ');
for k := 0 to N-1 do
if V shr k and 1 > 0 then
Write(P[k]:3, ' ');
end;
begin
// загрузка данных и вывод задачи на консоль
ReadLn(W);
ReadLn(N);
if N > MAX_N then Exit;
Write('Набрать сумму ', W:4, ' из чисел ');
for i := 0 to N-1 do begin
Read(P[i]);
Write(P[i]:3, ' ');
end;
WriteLn;
tOld:=0;
for V := 0 to (1 shl N)-1 do begin
// определение веса набора
T := 0;
for i := 0 to N-1 do
if V shr i and 1 > 0 then
Inc(T, P[i]);
// все решения - было для отладки
//PrintSolution('');
// вывод только нужных
if T = W then begin
if T > tOld then begin
// нашли первое решение
PrintSolution('- мусор'#13'Решения:');
tOld := T;
end
else
PrintSolution('');
end
else if T < W then begin
// может быть решением, если набрать не удастся
if T > tOld then begin
PrintSolution('- мусор');
tOld := T;
end
else if T = tOld then
PrintSolution('');
// случай T < tOld не выводим
end;
end;
end.
Ly8g0JjQtyDQutCw0LzQvdC10Lkg0LLQtdGB0L7QvCBQINGBINC40L3QtNC10LrRgdC+0LwgaSAoaT0xLi5OKSDRgtGA0LXQsdGD0LXRgtGB0Y8g0L3QsNCx0YDQsNGC0Ywg0LrRg9GH0YMg0LLQtdGB0L7QvCDRgNC+0LLQvdC+IFcuCi8vINCV0YHQu9C4INGN0YLQviDQvdC10LLQvtC30LzQvtC20L3Qviwg0L3QsNCx0YDQsNGC0Ywg0LzQsNC60YHQuNC80LDQu9GM0L3QviDQsdC70LjQt9C60YPRjiDQuiBXICjQvdC+INC80LXQvdGM0YjRg9GOLCDRh9C10LwgVykuCi8vINCf0L7Qu9C90YvQuSDQv9C10YDQtdCx0L7RgCDQv9GA0LggTiA8PSAzMC4KLy8gQ29weWxlZnQgQWxleGV5IEt1em1pbm92IChjKSAyMDE2Cgpwcm9ncmFtIFN0b25lczsKCmNvbnN0CiAgTUFYX04gPSAzMDsKdHlwZQogIFRJbmRleCA9IDAuLk1BWF9OLTE7CiAgVFN0b25lcyA9IGFycmF5IFtUSW5kZXhdIG9mIEludGVnZXI7Cgp2YXIKICBOOiBJbnRlZ2VyOwkJCQogIFA6IFRTdG9uZXM7CiAgaTogVEluZGV4OwogIFcsIFQsIHRPbGQ6IExvbmdJbnQ7CiAgVjogTG9uZ0ludDsKCgpwcm9jZWR1cmUgUHJpbnRTb2x1dGlvbihjb25zdCBzOiBTdHJpbmcpOwp2YXIKICBrOiBUSW5kZXg7CmJlZ2luCiAgV3JpdGUocyk7CiAgV3JpdGVMbjsKICAvLyDRgtC10LrRg9GJ0LjQuSDQstC10YEKICBXcml0ZShUOjQsJzogJyk7CiAgZm9yIGsgOj0gMCB0byBOLTEgZG8KICAgIGlmIFYgc2hyIGsgYW5kIDEgPiAwIHRoZW4KICAgICAgV3JpdGUoUFtrXTozLCAnICcpOwplbmQ7CgpiZWdpbgogIC8vINC30LDQs9GA0YPQt9C60LAg0LTQsNC90L3Ri9GFINC4INCy0YvQstC+0LQg0LfQsNC00LDRh9C4INC90LAg0LrQvtC90YHQvtC70YwKICBSZWFkTG4oVyk7CiAgUmVhZExuKE4pOwogIGlmIE4gPiBNQVhfTiB0aGVuIEV4aXQ7CiAgV3JpdGUoJ9Cd0LDQsdGA0LDRgtGMINGB0YPQvNC80YMgJywgVzo0LCAnINC40Lcg0YfQuNGB0LXQuyAnKTsKICBmb3IgaSA6PSAwIHRvIE4tMSBkbyBiZWdpbgogICAgUmVhZChQW2ldKTsKICAgIFdyaXRlKFBbaV06MywgJyAnKTsKICBlbmQ7CiAgV3JpdGVMbjsKCiAgdE9sZDo9MDsKICBmb3IgViA6PSAwIHRvICgxIHNobCBOKS0xIGRvIGJlZ2luCiAgICAvLyDQvtC/0YDQtdC00LXQu9C10L3QuNC1INCy0LXRgdCwINC90LDQsdC+0YDQsAogICAgVCA6PSAwOwogICAgZm9yIGkgOj0gMCB0byBOLTEgZG8KICAgICAgaWYgViBzaHIgaSBhbmQgMSA+IDAgdGhlbgogICAgICAgIEluYyhULCBQW2ldKTsKICAgIAogICAgLy8g0LLRgdC1INGA0LXRiNC10L3QuNGPIC0g0LHRi9C70L4g0LTQu9GPINC+0YLQu9Cw0LTQutC4CiAgICAvL1ByaW50U29sdXRpb24oJycpOwogICAgCiAgICAvLyDQstGL0LLQvtC0INGC0L7Qu9GM0LrQviDQvdGD0LbQvdGL0YUgCiAgICBpZiBUID0gVyB0aGVuIGJlZ2luCiAgICAJaWYgVCA+IHRPbGQgdGhlbiBiZWdpbgogICAgCSAgLy8g0L3QsNGI0LvQuCDQv9C10YDQstC+0LUg0YDQtdGI0LXQvdC40LUKICAgIAkgIFByaW50U29sdXRpb24oJy0g0LzRg9GB0L7RgCcjMTMn0KDQtdGI0LXQvdC40Y86Jyk7CiAgICAJICB0T2xkIDo9IFQ7CiAgICAJZW5kCiAgICAJZWxzZQoJCSAgUHJpbnRTb2x1dGlvbignJyk7CiAgICBlbmQKICAgIGVsc2UgaWYgVCA8IFcgdGhlbiBiZWdpbgogICAgICAvLyDQvNC+0LbQtdGCINCx0YvRgtGMINGA0LXRiNC10L3QuNC10LwsINC10YHQu9C4INC90LDQsdGA0LDRgtGMINC90LUg0YPQtNCw0YHRgtGB0Y8KICAgICAgaWYgVCA+IHRPbGQgdGhlbiBiZWdpbgogICAJICAgIFByaW50U29sdXRpb24oJy0g0LzRg9GB0L7RgCcpOwogICAgICAgIHRPbGQgOj0gVDsKICAgICAgZW5kCiAgICAgIGVsc2UgaWYgVCA9IHRPbGQgdGhlbgogICAgICAgIFByaW50U29sdXRpb24oJycpOwogICAgICAvLyDRgdC70YPRh9Cw0LkgVCA8IHRPbGQg0L3QtSDQstGL0LLQvtC00LjQvAogICAgZW5kOwogIGVuZDsKZW5kLg==