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

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

22.12.2019, 19:41. Показов 2236. Ответов 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 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru