好的,所以我试图解决背包问题。到目前为止我所做的是:
1)创建了三个ArrayLists- Weight,Profit&分数(利润/重量)
2)创建了分数的副本
3)按降序对得分进行排序
如您所见,下一步必须是根据分数的降序更改权重和利润数组列表中元素的位置
我这样做有点问题。 最初,我认为以下方法可以解决问题:
(P-profit ArrayList,W-weight ArrayList,S-Descending score ArrayList,D - Original Score ArrayList)
public void UpdateWandP(ArrayList <Double> P, ArrayList <Double> W, ArrayList <Double> S, ArrayList <Double> D){
for(int i=0;i<P.size();i++){
for(int j=0;j<P.size();j++){
if(D.get(i) == S.get(j)){
Swap(i,j,W);
Swap(i,j,P);
}
}
}
}
public void Swap(int i, int j, ArrayList <Double> A){
Collections.swap(A,i,j);
}
但是,我似乎无法获得正确的订购。
例如,如果我要在我的代码中添加以下内容:
P = {9,7,12,6,5}
W = {13,9,18,8,7}
我会得到一个Score ArrayList,如:
S = {0.69,0.77,0.66,0.75,0.71}
我会复制这个Score ArrayList
现在,我按降序排列S
S = {0.77,0.75,0.71,0.67,0.66}
我得到的输出是:
Profits: [9.0, 7.0, 12.0, 6.0, 5.0]
Weights: [13.0, 9.0, 18.0, 8.0, 7.0]
Scores: [0.6923076923076923, 0.7777777777777778, 0.6666666666666666, 0.75, 0.7142857142857143]
New Score: [0.7777777777777778, 0.75, 0.7142857142857143, 0.6923076923076923, 0.6666666666666666]
Updated P: [6.0, 7.0, 12.0, 9.0, 5.0]
Updated W: [8.0, 9.0, 18.0, 13.0, 7.0]
相对于新的Score ArrayList,我如何在Profit和Weight ArrayLists中进行更改?
答案 0 :(得分:2)
考虑使用自定义Item
类(List<Item>
)的单个列表而不是三个列表。
课程Item
将包含weight
和profit
成员变量,该课程将实施Comparable
。然后,您可以定义compareTo()
方法以在score = profit / weight
上订购,然后您可以使用Collections.sort()
对列表进行排序。这可确保所有权重/利润/分数保持一致,您只需使用单个列表。
班级Item
看起来像这样。 。 。
public class Item implements Comparable {
double weight;
double profit;
// Constructor, Getters, and Setters
@Override
public int compareTo(Item other) {
// sort descending on score
}
// optional getter method for score (don't necessarily need to store the score in member variable)
public double getScore() {
return this.profit / this.weight;
}
}
您可以像这样对列表进行排序。 。 。
public static void main(String [] args) {
List<Item> items = new ArrayList<Item>();
// add items
Collections.sort(items);
// list is now sorted on score
}
如果要以多种方式对列表进行排序,可以定义Comparator
类以对不同/多个字段进行排序。然后,您可以使用Collections.sort(List<Item>,Comparator<Item>)
进行排序。