We were given the below exercise, where the desired result is to print out the most valueable combination of "treasures" (can also be just one if it holds the most value and the right size) for the given sack size:
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);
}
}
}
So in this particular case, where the sack size is 30, the output should be:
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]
Because the combination of these treasures gives the most value for the given sack size.
Any idea how to tackle this problem and write the logic would be greatly appreciated.