mirea-projects/Second term/Discrete math/Задание_4.ipynb
2024-09-24 02:22:33 +03:00

1004 lines
27 KiB
Plaintext
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "iWFWs9SjJR1o"
},
"source": [
"### Комбинаторика в Питоне"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "Nh4EhvMbJUIa",
"outputId": "871cbe2f-db64-4ed6-a5bf-7678acdbdafa"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"None [2 1 3 4 5]\n"
]
}
],
"source": [
"import numpy as np\n",
"# создадим массив и передадим его в функцию np.random.shuffle()\n",
"arr = np.array([1, 2, 3, 4, 5])\n",
"\n",
"# сама функция выдала None, исходный массив при этом изменился\n",
"print(np.random.shuffle(arr), arr)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "Xrf3CqP2Fg1O",
"outputId": "fe95126f-2591-496d-a00a-eea6f92b99d0"
},
"outputs": [
{
"data": {
"text/plain": [
"(array([2, 4, 5, 1, 3]), array([1, 2, 3, 4, 5]))"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# еще раз создадим массив\n",
"arr = np.array([1, 2, 3, 4, 5])\n",
"\n",
"# передав его в np.random.permutation(),\n",
"# мы получим перемешанную копию и исходный массив без изменений\n",
"np.random.permutation(arr), arr"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "CRc0_oP1eO3y"
},
"source": [
"#### Модуль itertools"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Ib9u0kxzA785"
},
"source": [
"##### Перестановки"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "WdlV4ZrwdliN"
},
"source": [
"###### Перестановки без замены"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "fOdk6SujdoLH"
},
"source": [
"1. Перестановки без повторений"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "xdlxohSLeRUW",
"outputId": "9e9bfd0e-9a7a-4a41-a1e5-cb17668c5408"
},
"outputs": [
{
"data": {
"text/plain": [
"6"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# импортируем модуль math\n",
"import math\n",
"\n",
"# передадим функции factorial() число 3\n",
"math.factorial(3)"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "S5ceeFMfeNwT",
"outputId": "679f6eb5-2ef6-4f6a-e748-ea187470de80"
},
"outputs": [
{
"data": {
"text/plain": [
"[('A', 'B', 'C'),\n",
" ('A', 'C', 'B'),\n",
" ('B', 'A', 'C'),\n",
" ('B', 'C', 'A'),\n",
" ('C', 'A', 'B'),\n",
" ('C', 'B', 'A')]"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# импортируем модуль itertools\n",
"import itertools\n",
"\n",
"# создадим строку из букв A, B, C\n",
"x = 'ABC'\n",
"# помимо строки можно использовать и список\n",
"# x = ['A', 'B', 'C']\n",
"\n",
"# и передадим ее в функцию permutations()\n",
"# так как функция возвращает объект itertools.permutations,\n",
"# для вывода результата используем функцию list()\n",
"list(itertools.permutations(x))"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "DufioTwtfH5v",
"outputId": "93bfc07b-856b-4aa4-8d7f-0b82b20e58c4"
},
"outputs": [
{
"data": {
"text/plain": [
"6"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# чтобы узнать количество перестановок, можно использовать функцию len()\n",
"len(list(itertools.permutations(x)))"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "B-J32YZ4fQCL",
"outputId": "183f8a99-6ab5-4578-c584-ff5fa45332a7"
},
"outputs": [
{
"data": {
"text/plain": [
"[('A', 'B', 'C'),\n",
" ('A', 'B', 'D'),\n",
" ('A', 'B', 'E'),\n",
" ('A', 'B', 'F'),\n",
" ('A', 'C', 'B')]"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# теперь элементов исходного множества шесть\n",
"x = 'ABCDEF'\n",
"\n",
"# чтобы узнать, сколькими способами их можно разместить на трех местах,\n",
"# передадим параметр r = 3 и выведем первые пять элементов\n",
"list(itertools.permutations(x, r = 3))[:5]"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "NAkXrmpKfzUC",
"outputId": "c33775a0-0c6b-4cae-e7cb-1961fe254a5a"
},
"outputs": [
{
"data": {
"text/plain": [
"120"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# посмотрим на общее количество таких перестановок\n",
"len(list(itertools.permutations(x, r = 3)))"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "PqRx8pF0dtKm"
},
"source": [
"2. Перестановки с повторениями"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"id": "3qQ5QpTFpIJc"
},
"outputs": [],
"source": [
"# импортируем необходимые библиотеки\n",
"import itertools\n",
"import numpy as np\n",
"import math\n",
"\n",
"# объявим функцию permutations_w_repetition(), которая будет принимать два параметра\n",
"# x - строка, список или массив Numpy\n",
"# r - количество мест в перестановке, по умолчанию равно количеству элементов в x\n",
"def permutations_w_repetition(x, r = len(x)):\n",
"\n",
" # если передается строка,\n",
" if isinstance(x, str):\n",
" # превращаем ее в список\n",
" x = list(x)\n",
"\n",
" # в числителе рассчитаем количество перестановок без повторений\n",
" numerator = len(list(itertools.permutations(x, r = r)))\n",
"\n",
" # для того чтобы рассчитать знаменатель найдем,\n",
" # сколько раз повторяется каждый из элементов\n",
" _, counts = np.unique(x, return_counts = True)\n",
"\n",
" # объявим переменную для знаменателя\n",
" denominator = 1\n",
"\n",
" # и в цикле будем помещать туда произведение факториалов\n",
" # повторяющихся элементов\n",
" for c in counts:\n",
"\n",
" # для этого проверим повторяется ли элемент\n",
" if c > 1:\n",
"\n",
" # и если да, умножим знаменатель на факториал повторяющегося элемента\n",
" denominator *= math.factorial(c)\n",
"\n",
" # разделим числитель на знаменатель\n",
" # деление дает тип float, поэтому используем функцию int(),\n",
" # чтобы результат был целым числом\n",
" return int(numerator/denominator)"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "Fq0vyfdg--5m",
"outputId": "478c5a0b-0768-473c-ff1f-fd48231e0bda"
},
"outputs": [
{
"data": {
"text/plain": [
"120"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# создадим строку со словом \"молоко\"\n",
"x = 'МОЛОКО'\n",
"\n",
"# вызовем функцию\n",
"permutations_w_repetition(x)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "GoAiKH8-pIo3"
},
"source": [
"###### Перестановки с заменой"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "-uevbl8WdvsA",
"outputId": "b320a8a8-bfed-43b0-b8bf-8f041c6d256f"
},
"outputs": [
{
"data": {
"text/plain": [
"[('Ваниль', 'Ваниль'),\n",
" ('Ваниль', 'Клубника'),\n",
" ('Клубника', 'Ваниль'),\n",
" ('Клубника', 'Клубника')]"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# посмотрим, сколькими способами можно выбрать два сорта мороженого\n",
"list(itertools.product(['Ваниль', 'Клубника'], repeat = 2))"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "9uxp4aeItTED",
"outputId": "29ce5a18-39fd-4bf3-b3d5-0eb977763122"
},
"outputs": [
{
"data": {
"text/plain": [
"[('A', 'A'),\n",
" ('A', 'B'),\n",
" ('A', 'C'),\n",
" ('A', 'D'),\n",
" ('B', 'A'),\n",
" ('B', 'B'),\n",
" ('B', 'C'),\n",
" ('B', 'D'),\n",
" ('C', 'A'),\n",
" ('C', 'B'),\n",
" ('C', 'C'),\n",
" ('C', 'D'),\n",
" ('D', 'A'),\n",
" ('D', 'B'),\n",
" ('D', 'C'),\n",
" ('D', 'D')]"
]
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# посмотрим на способы переставить с заменой два элемента из четырех\n",
"list(itertools.product('ABCD', repeat = 2))"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "LLlYVJ6Cgwc9",
"outputId": "fe8ce0c1-d717-49c2-bd59-6c8ae45335fc"
},
"outputs": [
{
"data": {
"text/plain": [
"16"
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# убедимся, что таких способов 16\n",
"len(list(itertools.product('ABCD', repeat = 2)))"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "9TKsA791BEES"
},
"source": [
"##### Сочетания"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "tIbK4PNsyVwB",
"outputId": "09dbb8bf-a98c-4101-d465-2b6a19e88015"
},
"outputs": [
{
"data": {
"text/plain": [
"[('A', 'B'),\n",
" ('A', 'C'),\n",
" ('A', 'D'),\n",
" ('A', 'E'),\n",
" ('B', 'A'),\n",
" ('B', 'C'),\n",
" ('B', 'D'),\n",
" ('B', 'E'),\n",
" ('C', 'A'),\n",
" ('C', 'B'),\n",
" ('C', 'D'),\n",
" ('C', 'E'),\n",
" ('D', 'A'),\n",
" ('D', 'B'),\n",
" ('D', 'C'),\n",
" ('D', 'E'),\n",
" ('E', 'A'),\n",
" ('E', 'B'),\n",
" ('E', 'C'),\n",
" ('E', 'D')]"
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# возьмем пять элементов\n",
"x = 'ABCDE'\n",
"\n",
"# и найдем способ переставить два элемента из этих пяти\n",
"list(itertools.permutations(x, r = 2))"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "9NJLHZVP9xve",
"outputId": "1ec51fcc-93ee-4cc9-b130-47935e0a1d01"
},
"outputs": [
{
"data": {
"text/plain": [
"10"
]
},
"execution_count": 23,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# уменьшим на количество перестановок каждого типа r!\n",
"int(len(list(itertools.permutations(x, r = 2)))/math.factorial(2))"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "imUV1aSA_JI4",
"outputId": "44cc4c14-993e-492a-8a17-839cc41d0f0f"
},
"outputs": [
{
"data": {
"text/plain": [
"[('A', 'B'),\n",
" ('A', 'C'),\n",
" ('A', 'D'),\n",
" ('A', 'E'),\n",
" ('B', 'C'),\n",
" ('B', 'D'),\n",
" ('B', 'E'),\n",
" ('C', 'D'),\n",
" ('C', 'E'),\n",
" ('D', 'E')]"
]
},
"execution_count": 24,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# то же самое можно рассчитать с помощью функции combinations()\n",
"list(itertools.combinations(x, 2))"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "GNuEIKwl_Px1",
"outputId": "23f3ec43-59a5-4914-f2ad-aae6291ac8ad"
},
"outputs": [
{
"data": {
"text/plain": [
"10"
]
},
"execution_count": 25,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# посмотрим на количество сочетаний\n",
"len(list(itertools.combinations(x, 2)))"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "CPpGYzYJMuiv"
},
"source": [
"Сочетания с заменой"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "75SIWA4TMgj1",
"outputId": "f622aa9c-c089-4352-c2b1-f5f423947286"
},
"outputs": [
{
"data": {
"text/plain": [
"[('A', 'A'), ('A', 'B'), ('B', 'B')]"
]
},
"execution_count": 26,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# сколькими способами с заменой можно выбрать два элемента из двух\n",
"list(itertools.combinations_with_replacement('AB', 2))"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "DgCya-oDUIyd",
"outputId": "f78b7f06-b597-4006-d9cc-fa49fe45f809"
},
"outputs": [
{
"data": {
"text/plain": [
"[('A', 'B')]"
]
},
"execution_count": 27,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# очевидно, что без замены есть только один такой способ\n",
"list(itertools.combinations('AB', 2))"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "9xgg_wXLbjuu"
},
"source": [
"Биномиальные коэффициенты"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "6dDgzQTlB7ZF",
"outputId": "768cf35c-a548-450e-935c-dc84a6533d70"
},
"outputs": [
{
"data": {
"text/plain": [
"[('H', 'H', 'H'),\n",
" ('H', 'H', 'T'),\n",
" ('H', 'T', 'H'),\n",
" ('H', 'T', 'T'),\n",
" ('T', 'H', 'H'),\n",
" ('T', 'H', 'T'),\n",
" ('T', 'T', 'H'),\n",
" ('T', 'T', 'T')]"
]
},
"execution_count": 28,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# дерево вероятностей можно построить с помощью декартовой степени\n",
"list(itertools.product('HT', repeat = 3))"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "NFqzBH7lblyY",
"outputId": "e2d1b80c-a022-4878-8a5a-111019cdd561"
},
"outputs": [
{
"data": {
"text/plain": [
"3"
]
},
"execution_count": 29,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# посмотрим, в скольких комбинациях выпадет два орла при трех бросках\n",
"comb = len(list(itertools.combinations('ABC', 2)))\n",
"comb"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "q5YrLz3_sffO"
},
"source": [
"### Упражнения"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Задание 1**. Реализовать комбинаторные конструкции без использования библиотеки intertools. Проведите сравнительный анализ на быстродействие и объем используемой памяти. Сделайте выводы."
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {},
"outputs": [],
"source": [
"def permutations(items: list[int]):\n",
" if len(items) == 0:\n",
" yield []\n",
" else:\n",
" for i in range(len(items)):\n",
" for perm in permutations(items[:i] + items[i+1:]):\n",
" yield [items[i]] + perm\n",
"\n",
"def combinations(items: list[int], k: int):\n",
" if k == 0:\n",
" yield []\n",
" elif len(items) == k:\n",
" yield items\n",
" else:\n",
" for comb in combinations(items[1:], k-1):\n",
" yield [items[0]] + comb\n",
" for comb in combinations(items[1:], k):\n",
" yield comb\n",
"\n",
"def arrangements(items: list[int], k: int):\n",
" if k == 0:\n",
" yield []\n",
" else:\n",
" for i in range(len(items)):\n",
" for arr in arrangements(items[:i] + items[i+1:], k-1):\n",
" yield [items[i]] + arr"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"my func\n",
"\n",
"===Permutations===\n",
"Output: [[1, 2, 3, 4], [1, 2, 4, 3], [1, 3, 2, 4], [1, 3, 4, 2], [1, 4, 2, 3], [1, 4, 3, 2], [2, 1, 3, 4], [2, 1, 4, 3], [2, 3, 1, 4], [2, 3, 4, 1], [2, 4, 1, 3], [2, 4, 3, 1], [3, 1, 2, 4], [3, 1, 4, 2], [3, 2, 1, 4], [3, 2, 4, 1], [3, 4, 1, 2], [3, 4, 2, 1], [4, 1, 2, 3], [4, 1, 3, 2], [4, 2, 1, 3], [4, 2, 3, 1], [4, 3, 1, 2], [4, 3, 2, 1]]\n",
"Time: 4.315376281738281e-05\n",
"===Combinations===\n",
"Output: [[1, 2], [1, 3], [1, 4], [2, 3], [2, 4], [3, 4]]\n",
"Time: 1.0013580322265625e-05\n",
"===Arrangements===\n",
"Output: [[1, 2], [1, 3], [1, 4], [2, 1], [2, 3], [2, 4], [3, 1], [3, 2], [3, 4], [4, 1], [4, 2], [4, 3]]\n",
"Time: 1.4066696166992188e-05\n",
"\n",
"itertools\n",
"\n",
"===Permutations===\n",
"Output: [(1, 2, 3, 4), (1, 2, 4, 3), (1, 3, 2, 4), (1, 3, 4, 2), (1, 4, 2, 3), (1, 4, 3, 2), (2, 1, 3, 4), (2, 1, 4, 3), (2, 3, 1, 4), (2, 3, 4, 1), (2, 4, 1, 3), (2, 4, 3, 1), (3, 1, 2, 4), (3, 1, 4, 2), (3, 2, 1, 4), (3, 2, 4, 1), (3, 4, 1, 2), (3, 4, 2, 1), (4, 1, 2, 3), (4, 1, 3, 2), (4, 2, 1, 3), (4, 2, 3, 1), (4, 3, 1, 2), (4, 3, 2, 1)]\n",
"Time: 2.1219253540039062e-05\n",
"===Combinations===\n",
"Output: [(1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)]\n",
"Time: 5.0067901611328125e-06\n",
"===Arrangements===\n",
"Output: [(1, 2), (1, 3), (1, 4), (2, 1), (2, 3), (2, 4), (3, 1), (3, 2), (3, 4), (4, 1), (4, 2), (4, 3)]\n",
"Time: 5.0067901611328125e-06\n"
]
}
],
"source": [
"import time\n",
"\n",
"\n",
"def measure(func, *args):\n",
" start_time = time.time()\n",
" print(\"Output:\", list(func(*args)))\n",
" end_time = time.time()\n",
" print(\"Time:\", end_time - start_time)\n",
"\n",
"\n",
"items = [1, 2, 3, 4]\n",
"k = 2\n",
"\n",
"print(\"my func\\n\")\n",
"\n",
"print(\"===Permutations===\")\n",
"measure(permutations, items)\n",
"print(\"===Combinations===\")\n",
"measure(combinations, items, k)\n",
"print(\"===Arrangements===\")\n",
"measure(arrangements, items, k)\n",
"\n",
"print(\"\\nitertools\\n\")\n",
"print(\"===Permutations===\")\n",
"measure(itertools.permutations, items)\n",
"print(\"===Combinations===\")\n",
"measure(itertools.combinations, items, k)\n",
"print(\"===Arrangements===\")\n",
"measure(itertools.permutations, items, k)\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "awwMLMoylUED"
},
"source": [
"**Задание 2**. В новую школу не успели завезти парты в один из классов. Поэтому в этот класс принесли круглые столы из столовой. Столы в столовой разных размеров — на 4, 7 и 13 человек, всего их хватало на 59 человек. Когда часть столов отнесли в класс, в столовой осталось 33 места. Какие столы могли быть отнесены в класс?"
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Столы по 4 места: 0 | Столы по 7 мест: 0 | Столы по 13 мест: 2\n",
"Столы по 4 места: 3 | Столы по 7 мест: 2 | Столы по 13 мест: 0\n"
]
}
],
"source": [
"def find_possible_tables():\n",
" total_seats = 59\n",
" remaining_seats = 33\n",
" table_sizes = [4, 7, 13]\n",
"\n",
" for counts in itertools.product(range(total_seats // 4 + 1),\n",
" range(total_seats // 7 + 1),\n",
" range(total_seats // 13 + 1)):\n",
" if sum(count * size for count, size in zip(counts, table_sizes)) == total_seats-remaining_seats:\n",
" yield counts\n",
"\n",
"\n",
"for tables in find_possible_tables():\n",
" print(\"Столы по 4 места:\", tables[0], end=\" | \")\n",
" print(\"Столы по 7 мест:\", tables[1], end=\" | \")\n",
" print(\"Столы по 13 мест:\", tables[2])\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Задание 3**. Продавец имеет достаточное количество гирь для взвешивания следующих номиналов: 5гр, 10гр, 20гр, 50гр. каждый день к нему в магазин заходит житель соседнего дома и покупает ровно 500гр докторской колбасы. Продавец решил в течение месяца использовать различные наборы гирек для взвешивания. Сможет ли он выполнить задуманное?"
]
},
{
"cell_type": "code",
"execution_count": 51,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Да\n"
]
}
],
"source": [
"def find_possible_weights():\n",
" total = 500\n",
" weights = [5, 10, 20, 50]\n",
" \n",
" for counts in itertools.product(range(total // 5 + 1),\n",
" range(total // 10 + 1),\n",
" range(total // 20 + 1),\n",
" range(total // 50 + 1)):\n",
" if sum(count * weight for count, weight in zip(counts, weights)) == total:\n",
" yield counts\n",
"\n",
"print(\"Да\" if len(list(find_possible_weights())) >= 31 else \"Нет\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Задание 4**. Сколько можно найти различных семизначных чисел, сумма цифр которых равна ровно 50?"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"26418\n"
]
}
],
"source": [
"def find_numbers() -> list[int]:\n",
" possible_combinations = itertools.product(range(10), repeat=7)\n",
" valid_numbers = []\n",
"\n",
" for combination in possible_combinations:\n",
" if combination[0] != 0:\n",
" if sum(combination) == 50:\n",
" number = int(\"\".join(map(str, combination)))\n",
" valid_numbers.append(number)\n",
"\n",
" return valid_numbers\n",
"\n",
"\n",
"print(len(find_numbers()))\n"
]
}
],
"metadata": {
"colab": {
"provenance": [],
"toc_visible": true
},
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.11.0"
}
},
"nbformat": 4,
"nbformat_minor": 1
}