Для вашей проблемы я попробовал две реализации в зависимости от того, что вы хотите, в обоих решениях, которые, как я предполагал, вам абсолютно необходимо, чтобы ваш остаток был равен 0. В противном случае алгоритм вернет вас -1
. Если они вам нужны, скажите мне, что я могу адаптировать свой алгоритм.
Поскольку алгоритм реализован с помощью динамического программирования, он обрабатывает хорошие входные данные, по крайней мере, более 130 пакетов!
В первом решении я признал, что каждый раз мы заполняем самый большой пакет. Во втором решении я стараюсь минимизировать цену, но количество пакетов всегда должно быть равно 0.
remaining_order = 13
package_numbers = sorted([9,5,3], reverse=True) # To make sure the biggest package is the first element
prices = {9: 16, 5: 9, 3: 5}
required_packages = []
# First solution, using the biggest package each time, and making the total order remaining at 0 each time
ans = [[] for _ in range(remaining_order + 1)]
ans[0] = [0, 0, 0]
for i in range(1, remaining_order + 1):
for index, package_number in enumerate(package_numbers):
if i-package_number > -1:
tmp = ans[i-package_number]
if tmp != -1:
ans[i] = [tmp[x] if x != index else tmp[x] + 1 for x in range(len(tmp))]
break
else: # Using for else instead of a boolean value `found`
ans[i] = -1 # -1 is the not found combinations
print(ans[13]) # [0, 2, 1]
print(ans[9]) # [1, 0, 0]
# Second solution, minimizing the price with order at 0
def price(x):
return 16*x[0]+9*x[1]+5*x[2]
ans = [[] for _ in range(remaining_order + 1)]
ans[0] = ([0, 0, 0],0) # combination + price
for i in range(1, remaining_order + 1):
# The not found packages will be (-1, float('inf'))
minimal_price = float('inf')
minimal_combinations = -1
for index, package_number in enumerate(package_numbers):
if i-package_number > -1:
tmp = ans[i-package_number]
if tmp != (-1, float('inf')):
tmp_price = price(tmp[0]) + prices[package_number]
if tmp_price < minimal_price:
minimal_price = tmp_price
minimal_combinations = [tmp[0][x] if x != index else tmp[0][x] + 1 for x in range(len(tmp[0]))]
ans[i] = (minimal_combinations, minimal_price)
print(ans[13]) # ([0, 2, 1], 23)
print(ans[9]) # ([0, 0, 3], 15) Because the price of three packages is lower than the price of a package of 9
Я думаю, что Ваш лучший выбор состоит в том, чтобы забыть настраивать представление UIAlert и создать пользовательское представление самостоятельно.
Для одного то, что Вы показываете действительно, не является "предупреждением", таким образом, это в противоречии с тем, для чего UIAlertView разработан, чтобы быть. Это означает изменение парадигмы UI на пользователе, который никогда не является хорошей идеей.
Во-вторых, было бы намного легче анимировать пользовательское представление в место, чем попытаться взломать UIAlertView, чтобы заставить это делать то, что Вы хотите.
Нет никаких встроенных компонентов для этого. UIAlertView должен просто иметь текст и кнопки согласно документу HIG.
Необходимо будет создать собственное представление и добавить средства управления к нему. Пример HeadsUpUI в SDK показывает, как показать подобное пользовательскому меню представление наложением.
Надежда, которая помогает.
Сначала вам нужно увеличить окно предупреждения, чтобы в нем разместились элементы управления, но при этом его нужно разместить в центре.
Для этого вместо настройки размер кадра, текст вашего сообщения с символом "\ n" не обязательно. например:
alert = [[UIAlertView alloc] initWithTitle:@"Rate this picture."
message:@"Tap a star to rate.\n\n\n\n " /*------ look at here!!----*/
delegate:self
cancelButtonTitle:nil
otherButtonTitles:nil];
Затем используйте UIAlertViewDelegate для предупреждения.
переопределите его, viewWillAppear: добавьте кнопки и вручную установите их рамки в желаемое положение.
ИЛИ: создайте полное представление с помощью контроллера представления и добавьте представление в окно предупреждения, например:
[myalertview addSubvew:mycomplexalert];
Надеюсь, это поможет вам :)
Я использую окна предупреждений для ввода рейтинга с изображениями звездочек, твиттером, обратной связью в ФБ и т. д.
ОБНОВЛЕНИЕ iOS7:
Для iOS 7 создайте собственное представление с компонентами и установите его в качестве дополнительного представления для предупреждения:
[alert setValue:imageView forKey:@"accessoryView"];
Это просто: -)
В этом руководстве рассказывается, как для создания подкласса UIAlertView для создания текстового поля ввода. В нем объясняется, как увеличить представление, добавить подвиды (например, текстовые поля или изображения) и выполнить преобразование, чтобы переместить поле вверх на экране.