С Новым годом! Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
59 / 49 / 14
Регистрация: 23.02.2016
Сообщений: 433

Представление числа в виде сумм из списка

22.12.2019, 19:41. Показов 2203. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Имеется число 10 и список [5,2,1].
Найти все наборы
[5,5]
[5,2,2,1]
[5,2,1,2]
[5,1,2,2]
[5,2,1,1,1]
[5,1,2,1,1]
[5,1,1,2,1]
[5,1,1,1,2]
[5,1,1,1,1,1]
[2,5,2,1]
[2,5,1,2]
[2,2,5,1]
[2,2,1,5]
[1,5,2,2]
[1,5,2,1,1]
[1,5,1,2,1]
[1,5,1,1,2]
[1,1,5,2,1]
[1,1,5,1,2]
[1,1,1,5,2]
[1,1,1,2,5]
[1,1,2,5,1]
[1,1,2,1,5]
и так далее.

Как сделать? Может быть кто-нибудь писал нечто подобное?

Добавлено через 49 минут
Я придумал такой подход:
1. Обрабатываем список [5,2,1] по порядку и получаем списки
[5, 2, 1, 1, 1, 2, 1, 5]
[2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 2]
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
2. Обрабатываем каждый из этих списков. На примере списка [5, 2, 1, 1, 1, 2, 1, 5] выдергиваем списки
[5, 2, 1, 1, 1]
[5, 2, 2, 1]
[5, 5]
3. Каждый из обработанных списков отправляем в функцию tuple_list(...), которая вернёт всевозможные списки.

Python
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
#!/usr/bin/python3
 
from itertools import permutations
 
total = 10
 
board = [5,2,1]
def tuple_list(board):
    spisok = []
    arr = list(permutations(board))
    for i in range(len(arr)):
        cortej = arr[i]
        tuple_list = []
        for j in range(len(cortej)):
            tuple_list.append(cortej[j])
        spisok.append(tuple_list)
    return spisok
 
 
def foo(i=0, planks=[], tmp=0):
    for i in range(i, len(board)):
        tmp += board[i]
        while tmp <= total:
            planks.append(board[i])
            if i != len(board) - 1:
                foo(i+1, planks, tmp)
                tmp += board[i]
            else:
                tmp = tmp + board[i]
 
        if i == len(board) - 1:
            return planks
 
for i in range(len(board)):
    x_list = foo(i)
    print("X_LIST:", x_list)
    x_list.clear()
Шаг 2 ещё не писал.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.12.2019, 19:41
Ответы с готовыми решениями:

Представление числа N в виде всевозможных сумм K
Составить программу, которая печатает все различные представление числа N в виде всевозможных сумм K натуральных чисел (N, K-вводятся,...

Представление заданного числа в виде всевозможных сумм
в программе подразумевается рекурсия,но в моем случае функция должна возвращать 2 значения,значит,надо писать структуры(которые мы еще не...

Представление дерева в виде списка
Здравствуйте. Так и не могу понять, каким образом представляются деревья в виде списков! Можно пример?

14
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
22.12.2019, 23:24
Python
1
2
3
4
5
6
7
8
9
10
11
def f(s, n, p):
    if n <= 0:
        if n == 0:
            print(s)
    else:
        for x in a:
            f(s + [x], n - x, x)
 
n = 10
a = [5, 2, 1]
f([], n, 0)
Добавлено через 2 часа 15 минут
p - лишнее
Python
1
2
3
4
5
6
7
8
9
10
11
def f(s, n):
    if n <= 0:
        if n == 0:
            print(s)
    else:
        for x in a:
            f(s + [x], n - x)
 
n = 10
a = [5, 2, 1]
f([], n)
0
59 / 49 / 14
Регистрация: 23.02.2016
Сообщений: 433
23.12.2019, 08:42  [ТС]
eaa, спасибо! Сейчас проверю. Как-то слишком изящно выглядит у вас!

p.s. а я шаг 2 по своему подходу придумал как писать

Добавлено через 13 минут
eaa, спасибо огромное! Просто идеально, не представляю как такие вещи люди пишут, 2 дня думал и даже близко к такому не подошел...
0
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
23.12.2019, 08:56
Timurs, пожалуйста. Изучайте алгоритмы, тогда и у Вас получится.
0
59 / 49 / 14
Регистрация: 23.02.2016
Сообщений: 433
23.12.2019, 10:02  [ТС]
eaa, а не подскажите как это всё дело можно грамотно вернуть? Попробовал так, но на выходе какой-то ужас.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
ten_list = []
 
def f(s, n):
    if n <= 0:
        if n == 0:
            return s    
    else:
        for x in a:
            l = f(s + [x], n - x)
            if l:
                ten_list.append(l)
        print("ten_list:", ten_list)
        return ten_list
 
n = 10
a = [5, 2, 1]
 
f([], n)
 
i = 0
while i < len(ten_list):
    print(ten_list[i])
    i -= 1
Добавлено через 18 минут
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/usr/bin/python3
 
 
def f(s, n, x_list=[]):
    if n <= 0:
        if n == 0:
            if s:
                x_list.append(s)
            return x_list   
    else:
        for x in a:
            loop_list = f(s + [x], n - x)
        return loop_list
 
n = 10
a = [5, 2, 1]
 
ten_list = f([], n)
 
i = 0
while i < len(ten_list):
    print(ten_list[i])
    i -= 1
Вот так уже красиво, но на чём-то валится код IndexError: list index out of range. Не понятно в каком месте за границу вылазит.
0
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
23.12.2019, 10:05
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
ten_list = []
 
def f(s, n):
    if n <= 0:
        if n == 0:
            ten_list.append(s)
    else:
        for x in a:
            f(s + [x], n - x)
 
 
n = 10
a = [5, 2, 1]
f([], n)
 
for i in range(len(ten_list)):
    print(ten_list[i])
0
59 / 49 / 14
Регистрация: 23.02.2016
Сообщений: 433
23.12.2019, 11:15  [ТС]
Клавишей промазал...

Python
1
2
3
4
i = 0
while i < len(ten_list):
    print(ten_list[i])
    i += 1
Всё забрал, спасибо ещё раз

Добавлено через 1 минуту
eaa, глобально что-то не додумался объявить, впрочем и локально всё также работает.

Добавлено через 58 минут
eaa, не подскажите как ваш код преобразовать под случай когда числа были бы [5,3,2], n=11 и надо максимально плотно подойти к 11? То есть варианты [2,2,2,2,2], [3,3,3], [5,5] и т.п. либо вплотную [3,3,5] и т.п.
0
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
23.12.2019, 11:56
if n == -1 то 12
if n == 0 то 11
if n == 1 то 10
0
59 / 49 / 14
Регистрация: 23.02.2016
Сообщений: 433
23.12.2019, 12:12  [ТС]
eaa, правильно ли понимаю, что такой код

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
ten_list = []
 
def f(s, n):
    if n < 0:
        ten_list.append(s)
    else:
        for x in a:
            f(s + [x], n - x)
 
 
n = 10
a = [5, 2, 1]
f([], n)
 
for i in range(len(ten_list)):
    print(ten_list[i])
будет давать списки выходящие за границу числа, к которому стремимся, и если в этих списках удалить последний элемент, то это будет максимально плотное приближение к границе?

Добавлено через 6 минут
Нет, так не получится, [1,1,1,1,1,1,5] после удаления 5 не даст максимальное приближение к 10.

Добавлено через 7 минут
eaa, просто суть проблемы в том, что у меня нет конкретного n, а имеется диаметр бревна, который будут посылать датчики, то есть этот n какая-то переменная величина. А задача состоит в том, чтобы нарезать это дерево на слои, то есть имеется окружность с заданным диаметром n и набор слоев [200,100,50,25], на данный момент даже не знаю какие именно слои будут резать, список чисел просто. Так вот, надо сделать полный перебор слоев, думал задача сводится к задаче с этой десяткой, а вышло, что не совсем так ибо практически никогда не будет полного совпадения суммы слоев и диаметра, разве что в редчайших случаях, а потому надо максимально плотно подойти к диаметру.
0
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
23.12.2019, 12:55
угловая дисковая пилорама чтоли?
0
59 / 49 / 14
Регистрация: 23.02.2016
Сообщений: 433
23.12.2019, 13:07  [ТС]
eaa, ага)) Обрадовался было, что ваш код подойдет, а сейчас не знаю. Неужто вот этот велосипед, что в топике писать?
0
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
23.12.2019, 13:13
Ну посмотрите как программы раскроя работают и делайте по аналогии, там геометрию надо подключать. горизонтальное, вертикальное пиление, лафет не лафет, обзол не обзол и т.п.
0
59 / 49 / 14
Регистрация: 23.02.2016
Сообщений: 433
23.12.2019, 13:16  [ТС]
eaa, так не знаю где смотреть, в итоге сам всё придумываю сижу. Геометрию подключил, объекты придумал, горбыль учел сверху/снизу, толщину диска учел, обзол потом подправлю, до лафета не дошел, пока пишу горизонтальный раскрой (лафет как понимаю на радиальном раскрое).
0
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
23.12.2019, 13:57
ютуб, гугл только на английском. что то типа: timber sawing software
0
23.12.2019, 22:29

Не по теме:


Цитата Сообщение от eaa Посмотреть сообщение
Ну посмотрите как программы раскроя работают и делайте по аналогии, там геометрию надо подключать. горизонтальное, вертикальное пиление, лафет не лафет, обзол не обзол и т.п.
"Снимаю шляпу":) Значение последних двух терминов для меня - "новость"...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.12.2019, 22:29
Помогаю со студенческими работами здесь

Представление многочлена в виде списка
Помогите, пожалуйста!!! Нет вариантов для решения. Дана запись (в виде строки) многочлена от переменной х произвольной степени с...

Представление многочлена в виде списка
Помогите, пожалуйста!!! Нет вариантов для решения. Дана запись (в виде строки) многочлена от переменной х произвольной степени с...

Представление таблицы в виде линейного списка
Представить одну из приведенных ниже таблиц в виде линейного списка L, элементами которого являются строки таблицы. Написать процедуры...

Представление графа в виде списка вершин.
Стыдно спрашивать, просто хочется сделать чтобы все работало правильно и быстро. Дело в том, что раньше я всегда хранил граф в виде...

Представление графа в виде списка смежности
Добрый день,подскажите как представить граф в виде списка смежности?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru