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

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

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

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

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

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

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

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

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


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

17! / (1! 4! 5! 6!) = 171 531 360 вариантов
...
Рейтинг: 0 / 0
24.01.2019, 11:54
    #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
24.01.2019, 12:16
    #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
24.01.2019, 12:19
    #39764173
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как решить задачу по комбинаторике?
Запилите уже поиск в глубину.
...
Рейтинг: 0 / 0
24.01.2019, 12:25
    #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
24.01.2019, 12:37
    #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
24.01.2019, 12:39
    #39764199
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как решить задачу по комбинаторике?
КМК задача связана с Магическими квадратами.
...
Рейтинг: 0 / 0
24.01.2019, 13:07
    #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
24.01.2019, 13:59
    #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
24.01.2019, 14:02
    #39764300
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как решить задачу по комбинаторике?
Gennadiy Usov,

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

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

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

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

или

210 = а + 10 х в
...
Рейтинг: 0 / 0
24.01.2019, 14:47
    #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
24.01.2019, 14:59
    #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]