powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Как решить задачу по комбинаторике?
25 сообщений из 450, страница 10 из 18
Как решить задачу по комбинаторике?
    #39765984
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan),

блин, одно из уравнений исходных лишнее, последнее уравнение выходит из суммы 2-го и 3-го
...
Рейтинг: 0 / 0
Как решить задачу по комбинаторике?
    #39765990
Gennadiy Usov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kealon(Ruslan)x[8] + x[9] + x[10] + x[11] = b1
x[12] + x[13] +x[14] +x[15]+ x[16] = b2

чуток упрощаем
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
x[1] + sum +  b1 + b2 +  x[17]= 174
sum = 12 + b2; // Внешний круг
sum = 24 + b1 // Средний круг

sum = 3x[1]
// Шесть кругов
2 sum = 36  + b1 + b2

5 уравнений, 5 неизвестныхЯ ранее предупреждал, что любое решение уравнений (без выборок) приходит к тождествам.

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

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

Кроме массива х имеем массив хр, той же размерности, что и х.
В массиве хр хранятся значения либо 0 (перед началом работы программы), либо 1.
Если хр[i] = 1, то это означает, что выбрано или вычислено число i.

Все формулы находятся в некоторой процедуре.
b = x[i]
Если b > 20 или b<1, то эти аварийный выход.
Если xp[b] == 1 то аварийный выход
Иначе xp[b] = 1.

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

вы непоняли, одно из исходных уравнений композиция остальных, т.е. любое из уравнений кроме баланса можно выкинутьА что, это военная тайна, и Вы второй раз не указываете уравнения?
...
Рейтинг: 0 / 0
Как решить задачу по комбинаторике?
    #39766006
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
x[1] + a[1] + a[2] +a[3] +  x[8] + x[9] + x[10] + x[11] + x[12] + x[13] + x[14] + x[15] + x[16] +  x[17]= 174


любое из уравнений ниже можно исключить, оно будет вполняться если будут выполняться остальные
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
x[1] + a[1] + a[2] +a[3] +  x[8] + x[9] + x[10] + x[11] + x[12] + x[13] + x[14] + x[15] + x[16] +  x[17]= 174
sum = 12 + x[12] + x[13] + x[14] + x[15] + x[16]; // Внешний круг
sum = 18 + 6 + x[8] + x[9] + x[10] + x[11] // Средний круг
sum = a[1]  + a[2] + a[3] // Внутренний круг
sum = 12 + a[1] + x[1] + x[15] // Диаметр горизонтальный
sum = x[14] + a[3] + x[1] + x[12] // Диаметр cлева направо
sum = x[13] + a[2] + x[1] + x[16] // Диаметр cправа налево
// Шесть кругов
sum = 12 + x[9] + a[2]+ x[11] + x[12]
sum = 12 + x[13] + x[10] + a[3] + x[8]
sum = x[13] + x[14] + 18 + a[1] + x[9]
sum = x[14] + x[15] + 6 +a[2] + x[10]
sum = x[15] + x[16] + x[11] + a[3] + 18
sum = x[16] + x[12] + x[8] + a[1]  + 6



итого выйдет 12 уравнений, 15 неизвестных


это следует из того, что получилось зависимое уравнение при преобразовании системы
...
Рейтинг: 0 / 0
Как решить задачу по комбинаторике?
    #39766007
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пардон, из вот этих (баланс не трогаем)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
sum = 12 + x[12] + x[13] + x[14] + x[15] + x[16]; // Внешний круг
sum = 18 + 6 + x[8] + x[9] + x[10] + x[11] // Средний круг
sum = a[1]  + a[2] + a[3] // Внутренний круг
sum = 12 + a[1] + x[1] + x[15] // Диаметр горизонтальный
sum = x[14] + a[3] + x[1] + x[12] // Диаметр cлева направо
sum = x[13] + a[2] + x[1] + x[16] // Диаметр cправа налево
// Шесть кругов
sum = 12 + x[9] + a[2]+ x[11] + x[12]
sum = 12 + x[13] + x[10] + a[3] + x[8]
sum = x[13] + x[14] + 18 + a[1] + x[9]
sum = x[14] + x[15] + 6 +a[2] + x[10]
sum = x[15] + x[16] + x[11] + a[3] + 18
sum = x[16] + x[12] + x[8] + a[1]  + 6
...
Рейтинг: 0 / 0
Как решить задачу по комбинаторике?
    #39766009
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)чуток упрощаем
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
x[1] + sum +  b1 + b2 +  x[17]= 174
sum = 12 + b2; // Внешний круг
sum = 24 + b1 // Средний круг

sum = 3x[1]
// Шесть кругов
2 sum = 36  + b1 + b2


5 уравнений, 5 неизвестных
Продолжаем упрощать
sum/3 + sum + sum - 24 + sum - 12 + x[17]= 174
=>
10/3 sum + x[17] = 210
=>
x[17] = 210 - 10/3 sum
=>
x[17] = 210 - 10 x[1]

Тоже самое что и X = 210 - 10C 21793586

2 sum = 36 + b1 + b2 вырождается в 0=0
...
Рейтинг: 0 / 0
Как решить задачу по комбинаторике?
    #39766020
Gennadiy Usov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kealon(Ruslan)пардон, из вот этих (баланс не трогаем)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
sum = 12 + x[12] + x[13] + x[14] + x[15] + x[16]; // Внешний круг
sum = 18 + 6 + x[8] + x[9] + x[10] + x[11] // Средний круг
sum = a[1]  + a[2] + a[3] // Внутренний круг
sum = 12 + a[1] + x[1] + x[15] // Диаметр горизонтальный
sum = x[14] + a[3] + x[1] + x[12] // Диаметр cлева направо
sum = x[13] + a[2] + x[1] + x[16] // Диаметр cправа налево
// Шесть кругов
sum = 12 + x[9] + a[2]+ x[11] + x[12]
sum = 12 + x[13] + x[10] + a[3] + x[8]
sum = x[13] + x[14] + 18 + a[1] + x[9]
sum = x[14] + x[15] + 6 +a[2] + x[10]
sum = x[15] + x[16] + x[11] + a[3] + 18
sum = x[16] + x[12] + x[8] + a[1]  + 6

Не надо всё крушить.

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

давай проверим
Код: 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.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
#include <cstdio>
#include <algorithm>

// Копирование сортированного массива с пропуском заданных значений skipX (в порядке возрастания)
void copy_arr(const int* source, size_t size, int* dest, int skip0, int skip1 = 99, int skip2 = 99, int skip3 = 99, int skip4 = 99, int skip5 = 99) {
	const int *end = source + size;
	while (source < end && *source < skip0) *dest++ = *source++;
	source++;
	while (source < end && *source < skip1) *dest++ = *source++;
	source++;
	while (source < end && *source < skip2) *dest++ = *source++;
	source++;
	while (source < end && *source < skip3) *dest++ = *source++;
	source++;
	while (source < end && *source < skip4) *dest++ = *source++;
	source++;
	while (source < end && *source < skip5) *dest++ = *source++;
}

// Следующая комбинация элементов массива. false - больше нет
bool next_combination(size_t *idx, size_t size, size_t max) {
	for (size_t i = 0; i != size; i++) {
		idx[i]++;
		if (i + 1 == size) { // Последний
			if (idx[i] == max) {
				idx[i - 1] = i - 1;
				idx[i] = i;
				return false;
			}
		} else { // Не последний
			if (idx[i] == idx[i + 1]) {
				idx[i] = i;
			} else {
				break;
			}
		}
	}
	return true;
}

// Проверка что массив отсортирован
bool is_sort(int* arr, size_t size) {
	for (size_t i = 1; i != size; i++) {
		if (arr[i] <= arr[i - 1]) return false;
	}
	return true;
}

int count = 0;

void start(int center, int sum, int lost) {
	int num17[17] = { 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 13, 14, 15, 16, 17, 19, 20 };
	int num15[15]; // Массив без center и lost
	if (center < lost) {
		copy_arr(num17, 17, num15, center, lost);
	} else {
		copy_arr(num17, 17, num15, lost, center);
	}
	// Заполнение среднего круга по 4 из 15
	size_t ic[4] = {0, 1, 2, 3}; // Индексы выбранных элементов
	do { // Перебор по 4 из 15
		if (sum == 18 + 6 + num15[ic[0]] + num15[ic[1]] + num15[ic[2]] + num15[ic[3]]) {
			int num11[11];
			copy_arr(num15, 15, num11, num15[ic[0]], num15[ic[1]], num15[ic[2]], num15[ic[3]]);
			// Заполнение внешнего круга по 5 из 11
			size_t ie[5] = { 0, 1, 2, 3, 4}; // Индексы выбранных элементов
			do {
				if (sum == 12 + num11[ie[0]] + num11[ie[1]] + num11[ie[2]] + num11[ie[3]] + num11[ie[4]]) {
					int num_i[6]; // Внутреннее кольцо
					copy_arr(num11, 11, num_i, num11[ie[0]], num11[ie[1]], num11[ie[2]], num11[ie[3]], num11[ie[4]]);
					// Проверка суммы внутреннего кольца
					if (sum != num_i[0] + num_i[1] + num_i[2] + num_i[3] + num_i[4] + num_i[5]) {
						printf("!!! ERROR sum !!!\n");
						return;
					}
					if (!is_sort(num_i, 6)) {
						printf("!!! ERROR sort num_i !!!\n");
						return;
					}
					// Проверка диаметров
					// Нумерация х в соответствии с https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1308126&msg=21793805
					int *x2 = &num_i[0], *x3 = &num_i[1], *x4 = &num_i[2], *x5 = &num_i[3], *x6 = &num_i[4], *x7 = &num_i[5];
					int num_e[5]; // Внешнее кольцо
					int *x12 = &num_e[0], *x13 = &num_e[1], *x14 = &num_e[2], *x15 = &num_e[3], *x16 = &num_e[4];
					for (size_t i = 0; i != 5; i++) num_e[i] = num11[ie[i]];
					if (!is_sort(num_e, 5)) {
						printf("!!! ERROR sort num_e !!!\n");
						return;
					}
					int num_c[4]; // Среднее кольцо
					int *x8 = &num_c[0], *x9 = &num_c[1], *x10 = &num_c[2], *x11 = &num_c[3];
					for (size_t i = 0; i != 4; i++) num_c[i] = num15[ic[i]];
					if (!is_sort(num_c, 4)) {
						printf("!!! ERROR sort num_c !!!\n");
						return;
					}

					int *x1 = &center;
					do { // Вращение внутреннего кольца
						do { // Вращение внешнего кольца
							// Горизонтальный
							if (sum == 12 + *x2 + *x1 + *x5 + *x15) {
								// Справа налево
								if (sum == *x14 + *x4 + *x1 + *x7 + *x12) {
									// Слева направо
									if (sum == *x13 + *x3 + *x1 + *x6 + *x16) {
										do { // Вращение среднего кольца
											// Шесть кругов
											if (sum == 12 + *x9 + *x3 + *x6 + *x11 + *x12) {
												if (sum == 12 + *x13 + *x10 + *x4 + *x7 + *x8) {
													if (sum == *x13 + *x14 + 18 + *x5 + *x2 + *x9) {
														if (sum == *x14 + *x15 + 6 + *x6 + *x3 + *x10) {
															if (sum == *x15 + *x16 + *x11 + *x7 + *x4 + 18) {
																//if (sum == *x16 + *x12 + *x8 + *x2 + *x5 + 6) 
                                                                                                                               {
																	count++;
																	// Тут можно вывести правильное решение
																}
															}
														}
													}
												}
											}
										} while (std::next_permutation(num_c, num_c + 4));
									}
								}
							}
						} while (std::next_permutation(num_e, num_e + 5));
					} while (std::next_permutation(num_i, num_i + 6));
					
				}
			} while (next_combination(ie, 5, 11));
		}
	} while (next_combination(ic, 4, 15));
}

int main(int argc, char** argv[])
{
	start(19, 57, 20);
	printf("count %d\n", count);
	start(20, 60, 10);
	printf("count %d\n", count);
	return 0;
}



Код: plaintext
1.
2.
count 0
count 16

можешь любое из остальных попробовать закомментировать (текущий комментарий только раскрой)
...
Рейтинг: 0 / 0
Как решить задачу по комбинаторике?
    #39766049
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonТипичный случай. Новичек заходит в форум программирования и спрашивает - как быстро-быстро отсортировать массив целых чисел. Типа int. Или long. В оперативной памяти. При этом ему надо чтоб было ооочень быстро.Ему надо - пусть он и делает. И не надо подтирать носы по каждому чиху.

P.S.
Первая пара вопрос-ответ из древнего ЧАВО XFree86/2:
В. - Вы должны ...
О. - Я никому ничего не должен.

Более чем актуально.
...
Рейтинг: 0 / 0
Как решить задачу по комбинаторике?
    #39766068
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Табличку нарисовал для решения матрицами
constx1a1a2a3x8x9x10x11x12x13x14x15x16уравнение1211111sum = 12 + x[12] + x[13] + x[14] + x[15] + x[16] // Внешний круг241111sum = 18 + 6 + x[8] + x[9] + x[10] + x[11] // Средний круг111sum = a[1] + a[2] + a[3] // Внутренний круг12111sum = 12 + a[1] + x[1] + x[15] // Диаметр горизонтальный1111sum = x[14] + a[3] + x[1] + x[12] // Диаметр cлева направо1111sum = x[13] + a[2] + x[1] + x[16] // Диаметр cправа налево121111sum = 12 + x[9] + a[2]+ x[11] + x[12]121111sum = 12 + x[13] + x[10] + a[3] + x[8]181111sum = x[13] + x[14] + 18 + a[1] + x[9]61111sum = x[14] + x[15] + 6 +a[2] + x[10]181111sum = x[15] + x[16] + x[11] + a[3] + 1861111sum = x[16] + x[12] + x[8] + a[1] + 6
...
Рейтинг: 0 / 0
Как решить задачу по комбинаторике?
    #39766081
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

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

давай проверим
Код: 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.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
#include <cstdio>
#include <algorithm>

// Копирование сортированного массива с пропуском заданных значений skipX (в порядке возрастания)
void copy_arr(const int* source, size_t size, int* dest, int skip0, int skip1 = 99, int skip2 = 99, int skip3 = 99, int skip4 = 99, int skip5 = 99) {
	const int *end = source + size;
	while (source < end && *source < skip0) *dest++ = *source++;
	source++;
	while (source < end && *source < skip1) *dest++ = *source++;
	source++;
	while (source < end && *source < skip2) *dest++ = *source++;
	source++;
	while (source < end && *source < skip3) *dest++ = *source++;
	source++;
	while (source < end && *source < skip4) *dest++ = *source++;
	source++;
	while (source < end && *source < skip5) *dest++ = *source++;
}

// Следующая комбинация элементов массива. false - больше нет
bool next_combination(size_t *idx, size_t size, size_t max) {
	for (size_t i = 0; i != size; i++) {
		idx[i]++;
		if (i + 1 == size) { // Последний
			if (idx[i] == max) {
				idx[i - 1] = i - 1;
				idx[i] = i;
				return false;
			}
		} else { // Не последний
			if (idx[i] == idx[i + 1]) {
				idx[i] = i;
			} else {
				break;
			}
		}
	}
	return true;
}

// Проверка что массив отсортирован
bool is_sort(int* arr, size_t size) {
	for (size_t i = 1; i != size; i++) {
		if (arr[i] <= arr[i - 1]) return false;
	}
	return true;
}

int count = 0;

void start(int center, int sum, int lost) {
	int num17[17] = { 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 13, 14, 15, 16, 17, 19, 20 };
	int num15[15]; // Массив без center и lost
	if (center < lost) {
		copy_arr(num17, 17, num15, center, lost);
	} else {
		copy_arr(num17, 17, num15, lost, center);
	}
	// Заполнение среднего круга по 4 из 15
	size_t ic[4] = {0, 1, 2, 3}; // Индексы выбранных элементов
	do { // Перебор по 4 из 15
		if (sum == 18 + 6 + num15[ic[0]] + num15[ic[1]] + num15[ic[2]] + num15[ic[3]]) {
			int num11[11];
			copy_arr(num15, 15, num11, num15[ic[0]], num15[ic[1]], num15[ic[2]], num15[ic[3]]);
			// Заполнение внешнего круга по 5 из 11
			size_t ie[5] = { 0, 1, 2, 3, 4}; // Индексы выбранных элементов
			do {
				if (sum == 12 + num11[ie[0]] + num11[ie[1]] + num11[ie[2]] + num11[ie[3]] + num11[ie[4]]) {
					int num_i[6]; // Внутреннее кольцо
					copy_arr(num11, 11, num_i, num11[ie[0]], num11[ie[1]], num11[ie[2]], num11[ie[3]], num11[ie[4]]);
					// Проверка суммы внутреннего кольца
					if (sum != num_i[0] + num_i[1] + num_i[2] + num_i[3] + num_i[4] + num_i[5]) {
						printf("!!! ERROR sum !!!\n");
						return;
					}
					if (!is_sort(num_i, 6)) {
						printf("!!! ERROR sort num_i !!!\n");
						return;
					}
					// Проверка диаметров
					// Нумерация х в соответствии с https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1308126&msg=21793805
					int *x2 = &num_i[0], *x3 = &num_i[1], *x4 = &num_i[2], *x5 = &num_i[3], *x6 = &num_i[4], *x7 = &num_i[5];
					int num_e[5]; // Внешнее кольцо
					int *x12 = &num_e[0], *x13 = &num_e[1], *x14 = &num_e[2], *x15 = &num_e[3], *x16 = &num_e[4];
					for (size_t i = 0; i != 5; i++) num_e[i] = num11[ie[i]];
					if (!is_sort(num_e, 5)) {
						printf("!!! ERROR sort num_e !!!\n");
						return;
					}
					int num_c[4]; // Среднее кольцо
					int *x8 = &num_c[0], *x9 = &num_c[1], *x10 = &num_c[2], *x11 = &num_c[3];
					for (size_t i = 0; i != 4; i++) num_c[i] = num15[ic[i]];
					if (!is_sort(num_c, 4)) {
						printf("!!! ERROR sort num_c !!!\n");
						return;
					}

					int *x1 = &center;
					do { // Вращение внутреннего кольца
						do { // Вращение внешнего кольца
							// Горизонтальный
							if (sum == 12 + *x2 + *x1 + *x5 + *x15) {
								// Справа налево
								if (sum == *x14 + *x4 + *x1 + *x7 + *x12) {
									// Слева направо
									if (sum == *x13 + *x3 + *x1 + *x6 + *x16) {
										do { // Вращение среднего кольца
											// Шесть кругов
											if (sum == 12 + *x9 + *x3 + *x6 + *x11 + *x12) {
												if (sum == 12 + *x13 + *x10 + *x4 + *x7 + *x8) {
													if (sum == *x13 + *x14 + 18 + *x5 + *x2 + *x9) {
														if (sum == *x14 + *x15 + 6 + *x6 + *x3 + *x10) {
															if (sum == *x15 + *x16 + *x11 + *x7 + *x4 + 18) {
																//if (sum == *x16 + *x12 + *x8 + *x2 + *x5 + 6) 
                                                                                                                               {
																	count++;
																	// Тут можно вывести правильное решение
																}
															}
														}
													}
												}
											}
										} while (std::next_permutation(num_c, num_c + 4));
									}
								}
							}
						} while (std::next_permutation(num_e, num_e + 5));
					} while (std::next_permutation(num_i, num_i + 6));
					
				}
			} while (next_combination(ie, 5, 11));
		}
	} while (next_combination(ic, 4, 15));
}

int main(int argc, char** argv[])
{
	start(19, 57, 20);
	printf("count %d\n", count);
	start(20, 60, 10);
	printf("count %d\n", count);
	return 0;
}

можешь любое из остальных попробовать закомментировать (текущий комментарий только раскрой)Я уже комментировал этот код 21795114 21795146 21795207
...
Рейтинг: 0 / 0
Как решить задачу по комбинаторике?
    #39766104
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gennadiy Usov,
в плане любую одну из 12-ти проверок закомментировать, как это сделал я
...
Рейтинг: 0 / 0
Как решить задачу по комбинаторике?
    #39766108
Gennadiy Usov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kealon(Ruslan)Gennadiy Usov,
в плане любую одну из 12-ти проверок закомментировать, как это сделал яЯ не знаю как.

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

Нужен пример "одну из 12-ти проверок закомментировать".
найди вот эту строчку
Код: plaintext
1.
//if (sum == *x16 + *x12 + *x8 + *x2 + *x5 + 6) 


перед ней знак комментария, в проверках она не участвует, а результат тот же

выше неё ещё 11 проверок, каждую из них них так же можно закоментировать и результат не поменяется ( с моей правки только снять коментарий)
...
Рейтинг: 0 / 0
Как решить задачу по комбинаторике?
    #39766117
Gennadiy Usov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kealon(Ruslan)Gennadiy UsovНужен пример "одну из 12-ти проверок закомментировать".
найди вот эту строчку
Код: plaintext
1.
//if (sum == *x16 + *x12 + *x8 + *x2 + *x5 + 6) 


перед ней знак комментария, в проверках она не участвует, а результат тот же

выше неё ещё 11 проверок, каждую из них них так же можно закоментировать и результат не поменяется ( с моей правки только снять коментарий)Здесь всё очень просто.

Я уже сообщал о характере решений 21795098 :
"В частности, в нашей задачке останется только один вариант, один подвариант, 2 сочетания и 8 перестановок для каждого сочетания."
Всего 16 решений.

То есть, в коде несколько проверок для отсева, и поскольку у нас только один вариант (для 11 неизвестных) (это видно из таблицы решений), то другие варианты просто не доходят до этого уравнения.
...
Рейтинг: 0 / 0
Как решить задачу по комбинаторике?
    #39766148
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зачем так долго спорить. Есть факты.
12 ур-ний связи на пути. Путей всего 12. Это необходимый минимум.

Начала линейной и высшей алгебры гласят, что любые другие додумки будут их линейной комбинацией.

Также можно заменить любое кол-во ур-ний на другие, независимые от оставшихся и эквивалентные условиям.
Результат не изменится. Ранг системы всегда=10. Я приводил рисунок.
Можно переменные заменять на комбинацию первоначальных.
Результат не изменится. Получим 5 свободных переменных.

Вот мой вариант системы в текстовом виде, если нужно.
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
	уравнен	a	2	3	4	5	6	A	b	c	B	E	F	d	e	f	1	C	D	X	S	Y
1	6	3	0	0	0	0	0	0	0	0	0	-1	1	3	0	0	0	0	6	-40	30	0
2	7	0	3	0	0	0	0	0	0	0	0	-1	0	0	0	0	36	-18	-12	-20	0	0
3	8	0	0	3	0	0	0	0	0	0	0	-1	-1	0	0	0	-36	18	6	60	60	0
4	9	0	0	0	3	0	0	0	0	0	0	1	-1	0	0	0	36	0	-6	-80	-30	0
5	2	0	0	0	0	3	0	0	0	0	0	1	1	0	0	0	-36	36	12	60	120	0
6	12	0	0	0	0	0	3	0	0	0	0	0	1	0	0	0	36	-36	0	-20	30	0
7	5	0	0	0	0	0	0	1	0	0	0	1	0	0	0	0	0	18	0	0	30	0
8	10	0	0	0	0	0	0	0	3	0	0	0	-1	0	3	0	0	-18	0	20	60	0
9	3	0	0	0	0	0	0	0	0	3	0	1	0	0	0	3	0	18	-6	20	90	0
10	11	0	0	0	0	0	0	0	0	0	1	0	1	0	0	0	0	0	6	0	30	0

Я устранил ошибку в эвристиках, оставив только 120 вариантов для перебора, т.ч. матрица та же самая. Все константы справа. S - подразумевается в правой части ур-ния.
...
Рейтинг: 0 / 0
Как решить задачу по комбинаторике?
    #39766150
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По обозначениям.
abcdef - малый круг
ABCDEF - средний
123456 - радиусы
В таблице переставлены столбы - я так захотел. Результат не изменится.
...
Рейтинг: 0 / 0
Как решить задачу по комбинаторике?
    #39766156
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex55555На счёт "легко" - я даже не встречал, где там вообще про решение систем уравнений. А здесь ведь ещё и множественные решения (переменных больше, чем уравнений) с проверкой. То есть уже не просто решение систем, а переборный алгоритм с некой частью, решающей систему. Где такое в экселе? Просветите, плиз. Какие меню, какие расширения скачивать, какая версия ёкселя, ну и вообще - где искать? Искать где?
F1, раздел форума Микрософи офисс, пробовали? а также основы линейной алгебры?

Конкретнее. Есть т.н. "формулы", а есть макросы.
Формулы для того, чтобы одним кликом заполнить весь ряд или столб.
Приведение матрицы к диагональному виду - процесс итерационный. Развернуть итерации в послед-сть действий ручками.

Перебор независимых переменных - в зависимости от размеров можно ручками, копи-вставкой из сторонней утилиты, макросом VBA прямо в клетки листа.

Разумеется при вменяемых размерах. я на бумажке отсеял лишние значения. Осталось 120 комбинаций. Обошёлся без макросов и сторонних процедур.
...
Рейтинг: 0 / 0
Как решить задачу по комбинаторике?
    #39766183
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя... Крамер - рекурсивен. Потонуть можно. Меня получается 19 переменных в общем случае.

Может Гаусс-Зейдель. Тот вроде как более стабилен по времени. Треугольная матрица привлекательнее
чем ветвление дерева из (19-3) уровней.... Блииииин.
...
Рейтинг: 0 / 0
Как решить задачу по комбинаторике?
    #39766189
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Константы тоже обозначил как вершины графа.
...
Рейтинг: 0 / 0
Как решить задачу по комбинаторике?
    #39766260
Gennadiy Usov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хорошо. Пусть будет матрица.

И что с ней делать? Спрятаться за лозунгом "Начала линейной и высшей алгебры"? И что там сказано за нашу матрицу?

Составители матриц ошибаются:
имеется 13 уравнений (ещё - баланс) и 17 неизвестных (ещё х1 и х17)
...
Рейтинг: 0 / 0
Как решить задачу по комбинаторике?
    #39766266
Gennadiy Usov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonКонстанты тоже обозначил как вершины графа.Надо добавить ещё С10 - окружность баланса, или весы баланса, на которых расположен (или опирается) граф, а рядом противовес - V20 (по нашему - х17)
...
Рейтинг: 0 / 0
25 сообщений из 450, страница 10 из 18
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Как решить задачу по комбинаторике?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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