Нам дали следующее упражнение, где желаемый результат - распечатать наиболее ценную комбинацию «сокровищ» (также может быть только одну, если она содержит наибольшее значение и правильный размер) для данного размера мешка:
public class Treasure {
private String name;
private Integer size;
private Double value;
public Treasure(String name, Integer size, Double value) {
this.name = name;
this.size = size;
this.value = value;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getSize() {
return size;
}
public void setSize(Integer size) {
this.size = size;
}
public Double getValue() {
return value;
}
public void setValue(Double value) {
this.value = value;
}
//can also create new methods inside this class
@Override
public String toString() {
return "Treasure [name=" + name + ", size=" + size + ", value=" + value + "]";
}
}
import java.util.ArrayList;
import java.util.List;
public class Thief {
public static void main(String[] args) {
Thief thief = new Thief();
List<Treasure> treasuresList = thief.fillTreasures();
List<Treasure> sack = thief.steal(30, treasuresList);
thief.printTreasures(sack);
}
private List<Treasure> fillTreasures() {
List<Treasure> treasuresList = new ArrayList<Treasure>();
treasuresList.add(new Treasure("Ring", 1, 450d));
treasuresList.add(new Treasure("Necklace", 1, 400d));
treasuresList.add(new Treasure("Jewel", 4, 100d));
treasuresList.add(new Treasure("Coin", 4, 200d));
treasuresList.add(new Treasure("Bracelet", 5, 550d));
treasuresList.add(new Treasure("Pistol", 5, 1000d));
treasuresList.add(new Treasure("Clock", 10, 450d));
treasuresList.add(new Treasure("Glass", 15, 1000d));
treasuresList.add(new Treasure("Telescope", 30, 3100d));
treasuresList.add(new Treasure("Gold", 35, 3500d));
treasuresList.add(new Treasure("Silver", 33, 3300d));
treasuresList.add(new Treasure("Bronze", 31, 3100d));
return treasuresList;
}
public List<Treasure> steal(int sackSize, List<Treasure> treasuresList) {
//my effort so far
for (int i = 0; i < treasuresList.size(); i++) {
Treasure treasure = treasuresList.get(i);
//removes those whose size is greater than the sack
if (treasure.getSize() > sackSize) {
treasuresList.remove(i--);
}
//don't really know how to proceed from this point on
}
return treasuresList;
}
private void printTreasures(List<Treasure> treasuresList) {
for (int i = 0; i < treasuresList.size(); i++) {
Treasure treasure = treasuresList.get(i);
System.out.println(treasure);
}
}
}
Таким образом, в данном конкретном случае, когда размер мешка равен 30, на выходе должно быть:
Treasure [name=Ring, size=1, value=450.0]
Treasure [name=Coin, size=4, value=200.0]
Treasure [name=Bracelet, size=5, value=550.0]
Treasure [name=Pistol, size=5, value=1000.0]
Treasure [name=Glass, size=15, value=1000.0]
Поскольку комбинация этих сокровищ дает наибольшее значение дляс учетом размера мешка.
Любая идея, как решить эту проблему и написать логику, будет принята с благодарностью.