powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Как решить задачу по комбинаторике?
25 сообщений из 450, страница 1 из 18
Как решить задачу по комбинаторике?
    #39763897
Недавно наткнулся на очень на мой взгляд задачку по комбинаторике. Так как в школе комбинаторику плохо преподавали в своё время, никак решить не могу. Второй день мучаюсь. Есть варианты. Буду безумно благодарен, если поможете. Задачу прикрепляю. Изначально решил сделать обычный подбор состоящий из 9 циклов, но кажется есть путь попроще. И с другой стороны как сделать так, чтобы числа не повторялись, то есть уникальный подбор
1 2 3 4 5 6 7 8 9 ...
а не 11111233...
...
Рейтинг: 0 / 0
Как решить задачу по комбинаторике?
    #39763938
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий СмерксИзначально решил сделать обычный подбор состоящий из 9 циклов, но кажется есть путь попроще.
Это называется размещения без повторений, гугл в помощь .
...
Рейтинг: 0 / 0
Как решить задачу по комбинаторике?
    #39764017
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,
не так и много вариантов

17! / (4! 5! 6!) = 171 531 360
...
Рейтинг: 0 / 0
Как решить задачу по комбинаторике?
    #39764032
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
с акцентом Шварца: какие ваши доказательства?
...
Рейтинг: 0 / 0
Как решить задачу по комбинаторике?
    #39764070
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИМХО Не обязательно перебор всех вариантов устраивать, можно сначала упростить задачу, например перебрать всевозможные две диагонали - это ((17! / (13! * 4!)) * (13! / (9! * 4!))) всего 1701700 комбинаций. А дальше проверять только те решения, у которых сумма по диагоналям совпала.
...
Рейтинг: 0 / 0
Как решить задачу по комбинаторике?
    #39764074
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

а если твою формулу с другого круга начать? тоже самое выйдет ;-)?
освежить бы надо комбинаторику
...
Рейтинг: 0 / 0
Как решить задачу по комбинаторике?
    #39764075
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это - задача на бэктректинг. Думю что решение о том что нельзя поставить данную
расстановку надо принять гораздо раньше. До того как будут перебраны все варианты.
На ходу.

Грубо говоря здесь не совсем чисты факториал - а амортизированный.
...
Рейтинг: 0 / 0
Как решить задачу по комбинаторике?
    #39764077
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T, кроме того

((17! / (13! * 4!)) * (13! / (9! * 4!)))

наверное С(4, 17) * С(5, 13) хотел написать?
...
Рейтинг: 0 / 0
Как решить задачу по комбинаторике?
    #39764099
Фотография Малыхин Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут пересекающиеся множества тождественные между собой. (система линейных уравнений)

Есть несколько точек не принадлежащих множеству и центральный круг у которого нет собственных свободных точек.
у всех остальных тождественные множеств есть пара точек лежащих вне пересечения.
Суть задачи просто правильно сформулировать систему уравнений упростить ее и решить.
...
Рейтинг: 0 / 0
Как решить задачу по комбинаторике?
    #39764113
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Самые селективные предикаты поднять наверх. Тоесть не решать систему до конца а максимально
быстро принять решение что дальше решать не стоит.
...
Рейтинг: 0 / 0
Как решить задачу по комбинаторике?
    #39764114
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

и я ошибся всё таки, не увидел что одно число не расставляется, это уменьшает вдвое количество вариантов для полного перебора

17! / (2! 4! 5! 6! ) = 85 765 680


Малыхин Сергей, одно выпадающее число сразу удвацетирит количество систем, его наверное можно с ручкой и бумажкой порешать, но мы же программисты, проще перебрать
...
Рейтинг: 0 / 0
Как решить задачу по комбинаторике?
    #39764119
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хотя нет, всё верно

17! / (1! 4! 5! 6!) = 171 531 360 вариантов
...
Рейтинг: 0 / 0
Как решить задачу по комбинаторике?
    #39764134
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)Dima T, кроме того

((17! / (13! * 4!)) * (13! / (9! * 4!)))

наверное С(4, 17) * С(5, 13) хотел написать?
Нет, но немного ошибся, на 4 надо было умножить:
1. Берем все сочетания 17 по 4 (17! / (13! * 4!) = 2380) и подставляем их в горизонтальный диаметр 4-мя способами (каждый элемент в центр) - это 9520 комбинаций.
2. Из оставшихся все сочетания 13 по 4 в один диагональный диаметр - 715 комбинации. Если сумма не совпала, то п.1

9520*715 = 6806800
...
Рейтинг: 0 / 0
Как решить задачу по комбинаторике?
    #39764168
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

если твоим путём идти тебе нужно просуммировать все 4! варианта

по трём основным кругам: в 1-м 5 элементов нужно расставить, во втором - 4, в третьем - 6, центральный -1

будет сумма переборов

C(5, 17) * C(4, 12) * C(6, 8) * С(1, 2) +
C(4, 17) * C(5, 13) * C(6, 8) * С(1, 2) +
+...


т.е. 24 варианта замены порядка
...
Рейтинг: 0 / 0
Как решить задачу по комбинаторике?
    #39764173
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Запилите уже поиск в глубину.
...
Рейтинг: 0 / 0
Как решить задачу по комбинаторике?
    #39764185
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,
блин, вру, не надо их суммировать, везде одинаковое число будет

C(5, 17) * C(4, 12) * C(6, 8) * С(1, 2) = 17!/ 5! / 4! / 6!

C(4, 17) * C(5, 13) * C(6, 8) * С(1, 2) = 17! / 4!/ 5!/ 6!
...
Рейтинг: 0 / 0
Как решить задачу по комбинаторике?
    #39764197
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)Dima T,

если твоим путём идти тебе нужно просуммировать все 4! варианта

по трём основным кругам: в 1-м 5 элементов нужно расставить, во втором - 4, в третьем - 6, центральный -1

будет сумма переборов

C(5, 17) * C(4, 12) * C(6, 8) * С(1, 2) +
C(4, 17) * C(5, 13) * C(6, 8) * С(1, 2) +
+...


т.е. 24 варианта замены порядка
Нет. Сначала решаем упрощенную задачу: сумма двух диаметров совпала, поэтому без разницы в каком порядке на горизонтальном диаметре кроме центрального элемента, т.е. каждой комбинации из 17 по 4 есть всего 4 варианта записи (не 4!).
Например для набора 1,2,3,4 будет
Код: plaintext
1.
2.
3.
12,2,1,3,4
12,1,2,3,4
12,1,3,2,4
12,1,4,2,3
На этом этапе остальные комбинации это повтор этих, например 12,4,2,3,1 тоже самое что и 12,1,2,3,4

Для диагонального диаметра вообще без разницы какой порядок, т.к. центр заполнен горизонтальным.

На следующих шагах решения придется перебрать пропущенные комбинации, но это далеко не все возможные комбинации.
...
Рейтинг: 0 / 0
Как решить задачу по комбинаторике?
    #39764199
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КМК задача связана с Магическими квадратами.
...
Рейтинг: 0 / 0
Как решить задачу по комбинаторике?
    #39764234
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

зря мы тут по комбинаторике голову ломаем, все элементы связаны, т.е. позиция важна, придётся 17! вариантов перебирать

но
сумма трёх диагоналей 3S = сумме внутреннего и внешнего круга 2S + 3C


S = 3C, т.е. в центре число равное трети от суммы

пусть X выкинутое число
X + C + 3S= 21*20/2 =210

3X + 10 S = 630

Х = 10 | 20
соответственно
S = 60 | 57
С = 30 | 29 ??????????????????? что нереально

или где-то в условие неверно?
...
Рейтинг: 0 / 0
Как решить задачу по комбинаторике?
    #39764293
Gennadiy Usov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
На самом деле, всё ещё проще.

Общая сумма от 1 до 20 = 210.

Имеем 3 основных круга по 6 кружков. Всего 19 кружков.
Отнимаем от 210 значения 2-х произвольных кружков и делим оставшееся на 3.

Имеем 3 диаметра + средний круг (итого 4 элемента). Всего 19 кружков.
Отнимаем от 210 значения 1-ого произвольного кружка и добавляем 2 раза значение другого произвольного кружка. Всего 21 кружок. Всю сумму делим на 4.

Теперь ищем те значения выпадающих кружков для обоих случаев, где частные от делений совпадает.

А именно:
1)выкидываем 10, в центре 20, сумма круга (диаметра) 60
2)выкидываем 20, в центре 19, сумма круга (диаметра) 57.

Наверное, дальше, будет проще...
...
Рейтинг: 0 / 0
Как решить задачу по комбинаторике?
    #39764300
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gennadiy Usov,

выкинуть можно только кратное 3-м
...
Рейтинг: 0 / 0
Как решить задачу по комбинаторике?
    #39764304
Gennadiy Usov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kealon(Ruslan)Gennadiy Usov,

выкинуть можно только кратное 3-мА где это написано в условии?
...
Рейтинг: 0 / 0
Как решить задачу по комбинаторике?
    #39764323
Gennadiy Usov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно по формулам.

а - выкидываем,
в - в центре

(210 - а - в) / 3 = ( 210 - а + 2 х в) / 4

или

210 = а + 10 х в
...
Рейтинг: 0 / 0
Как решить задачу по комбинаторике?
    #39764352
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посчитал все варианты для трех диаметров
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
#include <iostream>
#include <cstdio>
#include <string.h>
#include <set>

int total = 0, count = 0, min_sum = 99, max_sum = 0;

std::set<int> sums;

// Перебор 9 по 4
void combination9by4(int* numbers13, size_t j0, size_t j1, size_t j2, size_t j3, int center, int sum) {
	int n0 = numbers13[j0], n1 = numbers13[j1], n2 = numbers13[j2], n3 = numbers13[j3];
	// Оставшиеся 9
	int numbers9[9];
	for (size_t i = 0, j = 0; i < 13; i++) {
		int n = numbers13[i];
		if (n != n0 && n != n1 && n != n2 && n != n3) {
			numbers9[j] = n;
			j++;
		}
	}
	// Сочетания 9 по 4
	for (size_t k0 = 0; k0 < 9; k0++) {
		for (size_t k1 = k0 + 1; k1 < 9; k1++) {
			for (size_t k2 = k1 + 1; k2 < 9; k2++) {
				for (size_t k3 = k2 + 1; k3 < 9; k3++) {
					if (sum == numbers9[k0] + numbers9[k1] + center + numbers9[k2] + numbers9[k3]) {
						if (sums.find(sum) == sums.end()) {
							sums.insert(sum);
							printf("sum = %d\n", sum);
							if (sum < min_sum) min_sum = sum;
							if (sum > max_sum) max_sum = sum;
						}
						count++;
					}
				}
			}
		}
	}

}


// Перебор 13 по 4
void combination13by4(int* numbers17, size_t i0, size_t i1, size_t i2, size_t i3) {
	int n0 = numbers17[i0], n1 = numbers17[i1], n2 = numbers17[i2], n3 = numbers17[i3];
	// Сумма горизонтального диаметра
	int sum = 12 + n0 + n1 + n2 + n3;
	// Оставшиеся 13
	int numbers13[13]; 
	for (size_t i = 0, j = 0; i < 17; i++) {
		int n = numbers17[i];
		if (n != n0 && n != n1 && n != n2 && n != n3) {
			numbers13[j] = n;
			j++;
		}
	}
	// Сочетания 13 по 4
	for (size_t j0 = 0; j0 < 13; j0++) {
		for (size_t j1 = j0 + 1; j1 < 13; j1++) {
			for (size_t j2 = j1 + 1; j2 < 13; j2++) {
				for (size_t j3 = j2 + 1; j3 < 13; j3++) {
					total++;
					if (sum == numbers13[j0] + numbers13[j1] + n1 + numbers13[j2] + numbers13[j3]) {
						combination9by4(numbers13, j0, j1, j2, j3, n1, sum);
					}
				}
			}
		}
	}

}

// Сочетания 17 по 4 (горизонталь)
void combination17by4() {
	// Возможные значения
	int numbers17[17] = { 1, 2, 3, 4 , 5, 7, 8, 9, 10, 11, 13, 14, 15, 16, 17, 19, 20 };

	for (size_t i0 = 0; i0 < 17; i0++) {
		for (size_t i1 = i0+1; i1 < 17; i1++) {
			for (size_t i2 = i1 + 1; i2 < 17; i2++) {
				for (size_t i3 = i2 + 1; i3 < 17; i3++) {
					combination13by4(numbers17, i1, i0, i2, i3);
					combination13by4(numbers17, i0, i1, i2, i3);
					combination13by4(numbers17, i0, i2, i1, i3);
					combination13by4(numbers17, i0, i3, i1, i2);
				}
			}
		}
	}
}

int main(int argc, char** argv[])
{
	combination17by4();
	printf("total %d  count %d  min_sum %d  max_sum %d\n", total, count, min_sum, max_sum);
	system("pause");
	return 0;
}



Результат 533520 комбинаций диаметров.
Дальше заполняем средний круг (6, 18, ... ) 4-мя из оставшихся 5-ти, т.е. комбинаций станет 533520 * 5.

Дальше остается перебрать комбинации в каждом диаметре (3!, 4!, 4!) и среднем круге (4!). Итого 82944.

Всего максимум 533520 * 5 * 82944 = 221`261`414`400. Многовато, но думаю комбинаций после заполнения среднего круга будет поменьше чем 5*533520.


Разбег сумм получился от 34 до 69.
...
Рейтинг: 0 / 0
Как решить задачу по комбинаторике?
    #39764366
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добавил заполнение среднего круга, вариантов осталось 41796, для каждого надо допроверить 82944 подварианта.

Итого 41796*82944 = 3`466`727`424. Это реально обсчитать перебором.
...
Рейтинг: 0 / 0
25 сообщений из 450, страница 1 из 18
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Как решить задачу по комбинаторике?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]