Как конвертировать алгоритм в питон

1

новый для python, и у меня возникли проблемы с преобразованием сценария в более эффективный алгоритм, который мне дал.

Здесь код python:

#!/usr/bin/env python

import itertools
target_sum = 10
a = 1
b = 2
c = 4
a_range = range(0, target_sum + 1, a)
b_range = range(0, target_sum + 1, b)
c_range = range(0, target_sum + 1, c)
for i, j, k in itertools.product(a_range, b_range, c_range):
    if i + j + k == 10:
        print a, ':', i/a, ',', b, ':',  j/b, ',', c, ':',  k/c

(например, он только 3 переменные, но я хочу использовать его на тысячах переменных в конце).

Здесь результат, который я ищу (все комбо, которые приводят к результату 10):

1 : 0 , 2 : 1 , 4 : 2
1 : 0 , 2 : 3 , 4 : 1
1 : 0 , 2 : 5 , 4 : 0
1 : 2 , 2 : 0 , 4 : 2
1 : 2 , 2 : 2 , 4 : 1
1 : 2 , 2 : 4 , 4 : 0
1 : 4 , 2 : 1 , 4 : 1
1 : 4 , 2 : 3 , 4 : 0
1 : 6 , 2 : 0 , 4 : 1
1 : 6 , 2 : 2 , 4 : 0
1 : 8 , 2 : 1 , 4 : 0
1 : 10 , 2 : 0 , 4 : 0

В вопросе Можно ли масштабировать алгоритмы грубой силы? был предложен лучший алгоритм, но мне сложно выполнять логику в python. Новый тестовый код:

    # logic to convert
    #for i = 1 to k
    #for z = 0 to sum:
    #    for c = 1 to z / x_i:
    #        if T[z - c * x_i][i - 1] is true:  #having trouble creating the table...not sure if thats a matrix
    #            set T[z][i] to true

#set the variables
sum = 10
data = [1, 2, 4]
# trying to find all the different ways to combine the data to equal the sum

for i in range(len(data)):
    print(i)
    if i == 0:
        continue
    for z in range(sum):
        for c in range(z/i):
            print("*" * 15)
            print('z is equal to: ', z)
            print('c is equal to: ', c)
            print('i is equal to: ', i)
            print(z - c * i)
            print('i - 1: ', (i - 1))

            if (z - c * i) == (i - 1):
                print("(z - c * i) * (i - 1)) match!")
                print(z,i)

Извините, что он явно довольно грязный, я понятия не имею, как создать таблицу в разделе, где есть:

if T[z - c * x_i][i - 1] is true:
    set T[z][i] to true

В других местах при преобразовании algo у меня было больше проблем, потому что в строках типа 'или я = 1 to k', конвертирующих его в python, возникает ошибка: "TypeError: 'int' object не является произносимым"

Любая помощь или предложения были бы потрясающими. Я изучил синтаксис в python, но еще ничего не сделал с алгоритмами (так что, пожалуйста, расскажите со мной).

Заранее спасибо.

  • 1
    Вы работаете с Python 3? Если вы работаете с Python 2, print foo а не print(foo) .
  • 3
    Нет ничего плохого в том, чтобы использовать print(foo) в Python 2.x, поэтому, если ему это нравится, не говорите ему не использовать его! Я делаю это много времени сам, когда пишу здесь.
Показать ещё 3 комментария
Теги:
algorithm

2 ответа

2
Лучший ответ

Вы можете получить тот блок, который создает таблицу для динамического программирования с помощью этого:

from collections import defaultdict

# T[x, i] is True if 'x' can be solved
# by a linear combination of data[:i+1]
T = defaultdict(bool)           # all values are False by default
T[0, 0] = True                # base case

for i, x in enumerate(data):    # i is index, x is data[i]
    for s in range(sum + 1):
        for c in range(s / x + 1):
            if T[s - c * x, i]:
                T[s, i + 1] = True
  • 0
    Спасибо за ответ, Я обновил свой вопрос, чтобы показать вывод. По сути, я упростил свой существующий скрипт, но я пытаюсь получить тот же вывод, что и ответ в ссылке на мой вопрос.
  • 1
    обновленный - вам все еще нужно будет использовать эту таблицу, чтобы получить ответы, которые вы хотите, у этого будет только True в T[(sum, len(data))] если решения существуют.
Показать ещё 3 комментария
1

Вы можете создать таблицу, которая вам нужна, со списком списков:

t = [[False for i in range(len(data))] for z in range(sum)] #Creates table filled with 'False'

for i in range(len(data)):
    print(i)
    if i == 0:
        continue
    for z in range(sum):
        for c in range(int(z/i)):
            print("*" * 15)
            print('z is equal to: ', z)
            print('c is equal to: ', c)
            print('i is equal to: ', i)
            print(z - c * i)
            print('i - 1: ', (i - 1))

            if (z - c * i) == (i - 1):
                print("(z - c * i) * (i - 1)) match!")
                t[z][i] = True     # Sets element in table to 'True' 

Что касается вашего TypeError, вы не можете сказать я = 1 к k, вам нужно сказать: for я in range(1,k+1): (предполагая, что вы хотите включить k).

Еще один совет: вы не должны использовать sum как имя переменной, потому что это уже встроенная функция python. Попробуйте помещать print sum([10,4]) в вашу программу где-нибудь!

  • 1
    Это должно быть for i in range(1, k+1) .
  • 0
    @Keith Cheers, это никогда не вырастает из-за ошибок-одиночек!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню