Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.05.2014, 19:35   #11
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Как из этого следует само разбиение? И так ясно, что в количественном и весовом должно пополам делиться
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 06.05.2014, 19:40   #12
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

А ни как.. это просто убирает варианты перебора
16 ->1 2 4 8 16
Отсюда разбить можно на 16 8 4 2 1 группы..
Poma][a вне форума Ответить с цитированием
Старый 06.05.2014, 22:34   #13
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Код:
uses Math;
type TElem = record
        count : LongInt;
        weight : LongInt
    end;

var
    a : array of LongInt;

procedure Check(w, n, k : LongInt); // суммарный вес, сколько групп, кол-во гирь в группе
var
    b : array of TElem;
    f : Boolean;

procedure P(n, k, j : LongInt);
var
    i : LongInt;
begin
    if j > High(a) then begin
        for i := Low(b) to High(b) do
            if b[i].weight <> w div n then Exit;
        f := TRUE;
        Exit
    end;

    for i := Low(b) to High(b) do begin
        if (b[i].weight + a[j] <= w div n) and (b[i].count < k) then begin
            Inc(b[i].weight, a[j]); Inc(b[i].count);
            P(n, k, j+1);
            Dec(b[i].weight, a[j]); Dec(b[i].count)
        end
    end
end;

var
    i : LongInt;
begin
    if n = 1 then Exit;
    f := FALSE;
    SetLength(b, n);
    for i := Low(b) to High(b) do begin
        b[i].count := 0; b[i].weight := 0
    end;
 
    P(n, k, 0);

    if f then begin
        WriteLn('Можно'); Halt(0)
    end
end;

var
    n, i, f, t, w : LongInt;

begin
    ReadLn(n);
    SetLength(a, n);

    for i := 0 to n-1 do
        Read(a[i]);

    f := MinIntValue(a);
    t := MaxIntValue(a);
    w := 0;
    for i := Low(a) to High(a) do
        Inc(w, a[i]);

    for i := Max(f, 2) to Min(t, Trunc(sqrt(w))) do begin
        if (w mod i = 0) and (n mod i = 0) then begin
            Check(w, i, n div i);
            Check(w, n div i, i)
        end
    end
end.
Я совсем не тестрировал..
И да.. Halt лучше не убирать.. а то косячок с выводом обеспечен (хотя убирается он легко)
Poma][a вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Повесить общую процедуру на событие кучки компонентов Valio Общие вопросы Delphi 14 13.10.2014 18:32
Задача: Найти количество всех 2K-значных счастливых билетов с суммой цифр, равной N. Lodyr Помощь студентам 7 04.01.2010 16:19
Проверка, является ли число равным одному из чисел, получаемых из запроса Adoquery Абдуллаев Рустам БД в Delphi 8 01.05.2009 17:06