shu*_*ham 2 java algorithm arraylist knapsack-problem dynamic-programming
我有一个与0-1背包类似的问题。
我试图做的修改是获取所选对象的列表,而不是成本。我尝试使用以下代码:
public static int fillPackage(double weight,ArrayList<Item> item, int n) {
//base case
if(n == 0 || weight == 0)
return 0;
if(item.get(n - 1).getWeight() > weight)
return fillPackage(weight, item, n - 1);
else {
int include_cost = item.get(n - 1).getCost() + fillPackage((weight - item.get(n - 1).getWeight()), item, n - 1);
int exclude_cost = fillPackage(weight, item, n - 1);
if(include_cost > exclude_cost) {
my_pack.add(item.get(n - 1));
return include_cost;
}
else {
return exclude_cost;
}
}
}
Run Code Online (Sandbox Code Playgroud)
这my_pack是ArrayList应该存储所选对象的。但是,它也存储其他对象。另外,我的参数是,因此无法使用DP表方法float。
应该在哪里my_pack.add()线放?
问:
应该在哪里
my_pack.add()线放?
A:
将my_pack.add()无处获得正确的代码。
让我告诉你如何做。您知道解决的方法0-1 Knapsack是:
best_cost = max(included_cost, excluded_cost)
Run Code Online (Sandbox Code Playgroud)
同样,您应该以这种方式考虑问题:
if included_cost > excluded_cost
best_choice = included_best_choice + included_item
else
best_choice = excluded_best_choice
Run Code Online (Sandbox Code Playgroud)
我修改了您的代码,它可以正确解决您的问题(您可以编辑并运行我的测试代码)。请参阅下面的代码。
如有任何疑问,请随时发表评论,我会尽快答复。
import java.util.ArrayList;
import java.util.List;
public class Package {
static List<Item> my_pack;
public static int fillPackage(double weight, ArrayList<Item> item, List<Item> optimalChoice, int n){
//base case
if(n == 0 || weight == 0)
return 0;
if(item.get(n-1).getWeight() > weight) {
List<Item> subOptimalChoice = new ArrayList<>();
int optimalCost =fillPackage(weight, item, subOptimalChoice, n-1);
optimalChoice.addAll(subOptimalChoice);
return optimalCost;
}
else{
List<Item> includeOptimalChoice = new ArrayList<>();
List<Item> excludeOptimalChoice = new ArrayList<>();
int include_cost = item.get(n-1).getCost() + fillPackage((weight-item.get(n-1).getWeight()), item, includeOptimalChoice, n-1);
int exclude_cost = fillPackage(weight, item, excludeOptimalChoice, n-1);
if(include_cost > exclude_cost){
optimalChoice.addAll(includeOptimalChoice);
optimalChoice.add(item.get(n - 1));
return include_cost;
}
else{
optimalChoice.addAll(excludeOptimalChoice);
return exclude_cost;
}
}
}
public static void main(String args[]) {
ArrayList<Item> itemList = new ArrayList<>();
itemList.add(new Item(2, 1));
itemList.add(new Item(5, 6));
itemList.add(new Item(3, 2));
itemList.add(new Item(4, 4));
itemList.add(new Item(7, 7));
printOptimalChoice(itemList, 9);
printOptimalChoice(itemList, 10);
printOptimalChoice(itemList, 11);
}
private static void printOptimalChoice(ArrayList<Item> itemList, double weight) {
my_pack = new ArrayList<>();
fillPackage(weight, itemList, my_pack, itemList.size());
System.out.println("Best choice for weight: " + weight);
for(int i = 0; i < my_pack.size(); i++) {
System.out.println(my_pack.get(i));
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的测试输出:
Best choice for weight: 9.0
Item{weight=5.0, cost=6}
Item{weight=4.0, cost=4}
Best choice for weight: 10.0
Item{weight=5.0, cost=6}
Item{weight=4.0, cost=4}
Best choice for weight: 11.0
Item{weight=2.0, cost=1}
Item{weight=5.0, cost=6}
Item{weight=4.0, cost=4}
Run Code Online (Sandbox Code Playgroud)
的代码Item.class:
class Item {
private double weight;
private int cost;
public Item(double weight, int cost) {
this.weight = weight;
this.cost = cost;
}
@Override
public String toString() {
return "Item{" +
"weight=" + weight +
", cost=" + cost +
'}';
}
public double getWeight() {
return weight;
}
public void setWeight(double weight) {
this.weight = weight;
}
public int getCost() {
return cost;
}
public void setCost(int cost) {
this.cost = cost;
}
}
Run Code Online (Sandbox Code Playgroud)