imho.ws |
![]() |
![]() |
![]() |
# 9 | |
Full Member
Регистрация: 30.04.2002
Сообщения: 1 419
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Цитата:
Если описание решения проблемы не занимает у него много места, то может быть процитируешь? |
|
![]() |
![]() |
# 11 |
Junior Member
Регистрация: 28.11.2003
Адрес: Израиль
Пол: Male
Сообщения: 67
![]() ![]() ![]() |
Можно это делать алгоритмом разложения на простые множители, однако если я понял правильно, тут ряд множителей дан заранее. Тогда вот за пару минут набросал на С:
#include <stdio.h> void main() { int dividers[] = {1,2,3}; int currentDivider, arrayPosition, divisionResult, residue; int X = 23, tempX; tempX = X; printf("\n%d is:\n", X); for (arrayPosition = 2; arrayPosition >= 0 ; arrayPosition--) { currentDivider = dividers[arrayPosition]; if (tempX < currentDivider) continue; else if (tempX == currentDivider) { printf("1 occurence of divider %d\n", currentDivider); break; } else { divisionResult = (int) (X/currentDivider); residue = X % currentDivider; printf("%d occurences of divider %d\n", divisionResult, currentDivider); tempX = residue; } } } Вывод: 23 is: 7 occurences of divider 3 1 occurence of divider 2
__________________
"Inter arma leges silent" - "молчат законы при звоне оружия" |
![]() |
![]() |
# 12 | |
Full Member
Регистрация: 30.04.2002
Сообщения: 1 419
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Цитата:
Спасибо, но это не то. Сам подумай (условие почитай). |
|
![]() |
![]() |
# 13 |
Advanced Member
Регистрация: 21.04.2005
Адрес: град Москва
Сообщения: 431
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Программировать влом, лучше подсчитать математически.
![]() Выпишем возможные варианты для первых чисел: (по три строчки для каждого числа) - - 1 - 2 1+1 3 2+1 1+1+1 3+1 2+2 2+1+1 1+1+1+1 3+2 3+1+1 2+2+1 2+1+1+1 1+1+1+1+1 3+3 3+2+1 3+1+1+1 2+2+2 2+2+1+1 2+1+1+1+1 1+1+1+1+1+1 3+3+1 3+2+2 3+2+1+1 3+1+1+1+1 2+2+2+1 2+2+1+1+1 2+1+1+1+1+1 1+1+1+1+1+1+1 3+3+2 3+3+1+1 3+2+2+1 3+2+1+1+1 3+1+1+1+1+1 2+2+2+2 2+2+2+1+1 2+2+1+1+1+1 2+1+1+1+1+1 1+1+1+1+1+1+1+1 3+3+3 3+3+2+1 3+3+1+1+1 3+2+2+2 3+2+2+1+1 3+2+1+1+1+1 3+1+1+1+1+1 2+2+2+2+1 2+2+2+1+1+1 2+2+1+1+1+1+1 2+1+1+1+1+1+1 1+1+1+1+1+1+1+1+1 Первая строчка - в слагаемых есть хоть одна тройка, Вторая строчка - в слагаемых есть хоть одна двойка, но нет тройки Третья - единичное представление. Это все разложение в сумму, со слагаемыми не выше трех. Число вариантов для каждой строки: s(1,1)=1 s(1,2)=0 s(1,3)=0 s(2,1)=1 s(2,2)=1 s(2,3)=0 s(3,1)=1 s(3,2)=1 s(3,3)=1 s(4,1)=1 s(4,2)=2 s(4,3)=1 s(5,1)=1 s(5,2)=2 s(5,3)=2 s(6,1)=1 s(6,2)=3 s(6,3)=3 s(7,1)=1 s(7,2)=3 s(7,3)=4 s(8,1)=1 s(8,2)=4 s(8,3)=5 s(9,1)=1 s(9,2)=4 s(9,3)=7 Всего способов разложить число n будет равно S(n)=s(n,1)+s(n,2)+s(n,3); s(n,1)=1 (очевидно) s(n,2)=s(n-2,2)+s(n-2,1)=s(n-2,2)+1; => s(n,2)=n/2, округленное снизу s(n,3)=s(n-3,3)+s(n-3,2)+s(n-3,1)=s(n-3,3)+(n-3)/2 (округл.)+1= ... 3*k^2+ поправка n=6k+остаток, поправка зависит от остатка: s(6k,3)=3k^2; s(6k+1,3)=3k^2+k; s(6k+2,3)=3k^2+2k; s(6k+3,3)=3k^2+3k+1; s(6k+4,3)=3k^2+4k+1; s(6k+5,3)=3k^2+5k+2; Или это выразить через n: s(n,3)=(n^2)/12, с округлением вниз до целого. Пример: s(9.3)=s(6*1+3,3)=3*1^2+3*1+1=7 (совпадает!) (или =81/12=7 + 7/12 -> 7 ) Для заданного n=23: S(23)=s(26,3)=3*4^2+2*k=56; Последний раз редактировалось Trotil; 28.03.2007 в 02:21. |
![]() |
![]() |
# 14 |
Junior Member
Регистрация: 08.12.2004
Сообщения: 132
![]() ![]() ![]() ![]() |
doro, предложенное решение согласуется с информацией, указанной в постах 1 и 3. Поскольку по твоим словам это не так, то более формализованное условие задачи в студию
![]() А еще - для какой задачи потребовалось такое разложение? Может существует более простое решение? Не заметил пост Trotil - это то, что необходимо, или все же нужно что-то другое? Последний раз редактировалось v_mirgorodsky; 25.01.2007 в 12:55. |
![]() |
![]() |
# 15 |
Full Member
Регистрация: 30.04.2002
Сообщения: 1 419
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Как я понял это количество вариантов?
Задача о планировании работ. В месяце необходимо выполнить определённое количество работ. Каждый вид работ имеет свой весовой коэффициент (первая последовательность). Одни виды работ выполняются ежедневно. Другие - не ежедневно (через день, раз в месяц, и т.п.). В одном виде работ может быть задействовано много людей, в другом - только один человек. Не все исполнители имеют право выполнять все работы (Вася - может думать, но не думать не может, Петя - может и думать и не думать). Необходимо раскидать имеющееся количество людей по видам работ и получить сумму весовых. При этом получаем сумму весовых коэффициентов для каждого человека, которую он получает при выполнении того или иного вида работ. После этого необходимо привести суммы коэффициентов каждого человека максимально близко к какому-то среднему (арифметическому, медиане, ...), используя только те значения весовых коэффициентов, которые были использованы при формировании каждой конкретной суммы весовых коэффициентов для каждого конкретного человека. При этом, если человек снимается с какого-то вида работ (для выравнивания сумм весовых коэффициентов - вторая последовательность), то, значит, кто-то должен быть поставлен на его место. Т.е. количество работ в месяц и людей задействованных в проведении каждого вида работ в день - константа. |
![]() |
![]() |
# 16 | ||
Junior Member
Регистрация: 28.11.2003
Адрес: Израиль
Пол: Male
Сообщения: 67
![]() ![]() ![]() |
Цитата:
![]() Цитата:
Алгоритм разложения здесь не подойдет. Он предполагает что множители простые, а в данном случае вполне вероятен ряд коэффициентов 1,2,3,4,5,6. Кроме того, на мой взгляд, тут должна приниматься в расчет составляющая компетентности, то есть кто может что делать - и нам уже требуется индекс компетентности для каждого работника. Неясны также факторы, которые следует учитывать в отношении работ . В общем, ИМХО, когда данные будут разъяснены, а задача построена, базируясь исключительно на алгебре предоставленных данных, то можно будет говорить о более конкретном алгоритме.
__________________
"Inter arma leges silent" - "молчат законы при звоне оружия" |
||
![]() |
![]() |
# 17 | |
Full Member
Регистрация: 30.04.2002
Сообщения: 1 419
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Цитата:
Весовые коэффициенты назначаются субъективно. Кто как посчитает нужным при первом запуске программы. Этот момент вообще не надо учитывать. Его учитывает для себя тот, кто будет работать с программой. Он решает кто и где. Если можно - что конкретно? |
|
![]() |
![]() |
# 18 |
Junior Member
Регистрация: 08.12.2004
Сообщения: 132
![]() ![]() ![]() ![]() |
Итак, давай попроще
![]() |
![]() |
![]() |
# 19 |
Full Member
Регистрация: 30.04.2002
Сообщения: 1 419
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
У работников вообще не может быть весовых коэффициентов.
Применительно к твоему условию задача будет звучать так: необходимо так расставить по работам рабочих, чтобы суммы набранных ими весовых коэффициентов (по видам работ, которые они будут выполнять) были если не одинаковыми, то по крайней мере имели минимальную разницу. При этом, например, в этом месяце рабочий (тот, который у тебя с коэффициентом 10) будет принимать участие в работе с коэффициентом 35, остальные же могут быть привлечены к любой работе. |
![]() |
![]() |
# 20 | |
Junior Member
Регистрация: 08.12.2004
Сообщения: 132
![]() ![]() ![]() ![]() |
Цитата:
![]() Добавлено через 2 минуты Тогда еще сопутствующие вопросы: - каково количество планируемых/работающих людей? Интересует порядок цифр - десятки, сотни? - какова длительность планируемого периода? |
|
![]() |