Сумма подмножества с плавающей запятой

Учтите, что у вас есть набор поплавков, например

4.2  ; 2.6  ;  6.9  ;  1.1

И вам нужно определить, существует ли Подмножество, сумма которого равна 5,3, и если да, то вернуть это множество.

Все заданные числа всегда имеют один десятичный знак.

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

Мой вопрос: поскольку мы рассматриваем поплавки, как бы вы справились с этим эффективно?

Стандартный подход к динамическому программированию не кажется хорошим кандидатом, так как мне потребовалось бы построить таблицу, учитывающую все возможные значения float от 0 до целевого числа (5,3 в этом примере). Поскольку мы знаем, что у нас всегда одна десятичная точка, я думаю, можно представить себе такую ​​таблицу:

     0 | 0.1 | 0.2 | ... | 5.3
4.2   
2.6
6.9
1.1

но я не думаю, что это будет хорошо масштабироваться... (Здесь 5,3 - это просто значение для простоты, у меня нет информации о целевом значении, связанном на практике.)

Любые мысли о том, как справиться с этим?


person nmpg    schedule 08.08.2015    source источник
comment
Однозначные числа с плавающей запятой — это просто отвлечение. Думайте о целых числах.   -  person High Performance Mark    schedule 08.08.2015
comment
@HighPerformanceMark Конечно, я мог бы использовать HashMap, чтобы связать их, но я хочу сказать, что, следуя подходу динамического программирования, мне нужно иметь как можно больше столбцов с плавающей запятой между 0 и целевым значением .. нет?   -  person nmpg    schedule 08.08.2015


Ответы (1)


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

Для самых распространенных форматов с плавающей запятой, основанных на стандарте IEEE 754 с плавающей запятой, ответ прост. Не существует набора чисел с плавающей запятой, сумма которых равна 5,3. Единственными точно представляемыми значениями с одним десятичным знаком являются значения с 0 или 5 в качестве цифры после запятой.

С другой стороны, если бы вы умножили все входные данные на 10 и округлили до ближайшего целого числа, вы могли бы решить это так же, как и для целых чисел.

person Patricia Shanahan    schedule 08.08.2015