/BackPackPuzzle

Knapsack task for Raiffeisen Bank (.Net, C#)

Primary LanguageC#

Условие

Уилл Тернер решил устроить пир как в старые добрые времена и попросил своего друга, капитана Джека Воробья, организовать это мероприятие. Джек решил, что для того чтобы пирушка удалась, ему необходимо купить N галлонов ямайского рома Appleton. Ром можно добыть в ряде мест:

  • В Порт-Ройале есть три лавки, в которых торгуют ромом. В лавке Мэллроя есть 50 бутылок (в бутылке один галлон) по цене 50 пиастров за штуку, в лавке Сяо Фэня есть 60 бутылок по цене 52 пиастра, и в винном погребе Черной Бороды есть 200 по цене 55 пиастров.

  • Сундук со ста бутылками отличного рома имеется у Дэйви Джонса на палубе Летучего голландца. Проблема в том, что Дэйви не торгует ромом, и чтобы раздобыть этот сундук Джеку необходимо щедро заплатить дюжине отважных пиратов, которые помогут захватить сундук силой. Суммарные расходы на захват сундука составляют 5100 пиастров.

  • Похожая ситуация с Гектором Барбоссой. У Гектора есть целых три сундука по сто бутылок, каждый из которых стоит 5050 пиастров, и он даже готов их продать. Но Гектор в данный момент уплыл на Странные берега, и ради продажи одного сундука возвращаться не станет. Но он готов вернуться, если купить у него хотя бы два сундука.

  • Также небольшое торговое судно с ромом некогда было захвачено Кракеном. В нем есть двести бутылок хорошо сохранившегося рома, но чтобы отбить судно у Кракена потребуется небольшой флот. Нанять необходимое число кораблей можно за 10800 пиастров.

Лишних пиастров у Джека никогда не бывает, поэтому он хочет минимизировать свои расходы. Напишите Java программу, которая реализует интерфейс JackSparrowHelper.

P.S. Программа должна быть понятно написана

P.P.S. Программа будет протестирована с использованием не только приложенного, но и другого csv файла, имеющего тот же формат.

package pirates;

public class Purchase {
    String sourceName; // название источника в файле sources.csv
    Integer numberOfGallons; // число галлонов, купленное у этого источника
    Double priceOfGallon; // цена галлона у этого источника
}
package pirates;

import java.util.TreeSet;

public class Purchases {
    Integer numberOfGallons; // совокупное число галлонов (из условия)
    TreeSet<Purchase> purchases; // набор покупок в разных источниках
    Double averagePriceOfGallon; // средняя цена галлона по всем источникам
}
package pirates;

public interface JackSparrowHelper {
    /**
     * @param path            Полный путь к csv файлу с ценами и количествами (sources.csv), доступными в разных местах
     * @param numberOfGallons совокупное количество галлонов, нужное Джеку
     * @return <tt>Purchases</tt> детальный совет Джеку, где и в каком количестве покупать ром
     */
    Purchases helpJackSparrow(String path, int numberOfGallons);
}

Пример исходных данных (CSV)

Source Name;Size;Average price of gallon;Min size;Step size
Mulroy;50;50.0;1;1
Sao Feng;60;52.0;1;1
Black Beard;200;55.0;1;1
Davy Jones;100;51.0;100;100
Hector Barbossa;300;50.5;200;100
Kraken;200;54.0;200;200

Диаграмма классов Class Diagram