Поскольку объявления об объектной функции не найдено, я предполагаю, что ваша цель - максимизировать значение пакета в пределах возможностей пакета.
Пояснение: временная сложность исправлена. Оптимальное решение может заключаться не в заполнении максимально ценного предмета, вам нужно искать все возможные комбинации. Однако вы можете повторно использовать возможные оптимальные решения, которые вы искали, чтобы сэкономить место. Например, [5,5,3]
получается путем добавления 3
к предыдущей попытке [5,5]
, чтобы промежуточный результат можно было «кэшировать». Вы можете использовать массив или набор для хранения возможных решений. Приведенный ниже код работает так же, как и код rosetta, но я думаю, что он понятнее.
Для дальнейшей оптимизации используйте приоритет, установленный для opts
.
costs = [3,5,9]
value = [5,9,16]
volume = 130
# solutions
opts = set()
opts.add(tuple([0]))
# calc total value
cost_val = dict(zip(costs, value))
def total_value(opt):
return sum([cost_val.get(cost,0) for cost in opt])
def possible_solutions():
solutions = set()
for opt in opts:
for cost in costs:
if cost + sum(opt) > volume:
continue
cnt = (volume - sum(opt)) // cost
for _ in range(1, cnt + 1):
sol = tuple(list(opt) + [cost] * _)
solutions.add(sol)
return solutions
def optimize_max_return(opts):
if not opts:
return tuple([])
cur = list(opts)[0]
for sol in opts:
if total_value(sol) > total_value(cur):
cur = sol
return cur
while sum(optimize_max_return(opts)) <= volume - min(costs):
opts = opts.union(possible_solutions())
print(optimize_max_return(opts))
Если ваше требование «просто наполни пакет», то будет проще использовать объем для каждого предмета.
форма jQuery является лучшим способом сделать это, можно добавить его к любой нормальной форме,
<form method="post" action="URL">
<input type="file" name="file">
<input type="text" name"text">
<input type="submit">
</form>
<script type="text/javascript">
$(document).ready(function() {
$(form).ajaxForm();
})
</script>
будет работать как ожидалось, но с ajax.
Вы не можете загрузить файлы через JavaScript.
Проверьте этот связанный вопрос:
Действительно ли возможно использовать Ajax, чтобы сделать загрузку файла?
По существу два самых популярных способа "фальсифицировать" Ajax для загрузок файла используют Флеш-плагин, такой как SWFUpload или отправляют форму скрытому iframe, который обрабатывает запрос.
Если можно управлять средой, как, скажем, Вы пишете приложение администрирования для интранет, в которой Вы рекомендуете браузер, то реальные загрузки файла Ajax возможны с Firefox 3 и выше. Во всех других случаях, iframe обходном решении или основанном на Flash загрузчике способ пойти.
Это возможно, но не работает в Google Chrome) Смотрите!
...
<form method='post' enctype='multipart/form-data'>
<input type="file" id="imf" name="imf"/>
<input type="button" id="Save"/>
</form>
...
$("#Save").live("click", function(){
var photo = document.getElementById("imf");
var file = photo.files[0];
$.post('/user/saveNewPhoto', {'imf':file.getAsDataURL(), fname:file.fileName }, function( data ){
alert ( data );
});
});
дополнительный сценарий загрузки требует декодирования base64) и все , но я не тестировал этот сценарий на файле большого размера