我正在处理套袋问题。我获得了一个项目列表(整数)和包含maxSize的行李。我试图找到最少量的袋子以适应所有物品。我需要以递归方法执行此操作。
我正在存储bag对象(这是整数的ArrayList,有一些辅助方法可以检查大小+ int是否大于bag的maxSize)。然后我将所有这些包存储在ArrayList对象中。我遇到的问题是我似乎在为每个包添加每个项目。以下是我认为问题所在的方法。一旦我发现我可以将物品添加到'i'的包中,我想不出退出的方法。在这一点上,我需要得到一个新的项目,并尝试将它包装在第一个袋子,如果它不适合然后尝试第二个,第三个等。
baggedList = ArrayList :::: recList =我试图收集的整体列表
我觉得我过度复杂了。如果您有任何更好的建议,请告诉我们。
public boolean bagging (ArrayList<Integer> recList){
boolean keepBagging = true;
System.out.println("right before the recursive method");
System.out.println("the reclist before while loop" + recList.toString());
while (!recList.isEmpty() && keepBagging){
int item = recList.remove(recList.size() -1);
for (int i= 0; i < baggedList.size(); i ++){
System.out.println("i = " + i + " Item = " + item);
if (tryToBag(item, i)){ //boolean method
addItem (item, i); //adds the item
bagging (recList); //recursive call
}
else {
System.out.println("FAILED" + keepBagging);
keepBagging = false;
}
}
}
return keepBagging;
}
调用Bag方法的CanBag方法
private boolean tryToBag(int item, int i) {
boolean canBag = false;
Bag currentBag = baggedList.get(i);
ArrayList<Integer> list = currentBag.getList();
if (currentBag.canBag(item)){
canBag = true;
}
return canBag;
}
canBag方法
public boolean canBag(int size){
if (size + Bag.sum() <= maxBagSize){
return true;
}
else return false;
}
的toString
public String toString(){
int counter = 0;
String ret = "";
for (int i = 0; i < baggedList.size(); i++){
Bag tryThisBag = baggedList.get(i);
ret += "bag " + counter + tryThisBag.getList().toString();
counter++;
}
return ret;
}
addItem方法
private void addItem(int item, int i) {
Bag currentBag = baggedList.remove(i); //removing list
ArrayList<Integer> list = currentBag.getList(); // new list
list.add(item); //adding item
System.out.println ("List here at bag" + i + " : " + list.toString());
currentBag.setList(list); // sets the arrayList back to the bag object
baggedList.add(i, currentBag); //sets the bag at the index in the collection of bags
}
答案 0 :(得分:0)
public boolean bagging (ArrayList<Integer> recList){
boolean keepBagging = true;
System.out.println("right before the recursive method");
System.out.println("the reclist before while loop" + recList.toString());
while (!recList.isEmpty() && keepBagging) {
int item = recList.remove(recList.size() -1);
for (int i= 0; i < baggedList.size(); i ++){
System.out.println("i = " + i + " Item = " + item);
if (tryToBag(item, i)){ //boolean method
addItem (item, i); //adds the item
break;
}
else {
System.out.println("FAILED" + keepBagging);
keepBagging = false;
}
}
}
return keepBagging;
}
我只是在您的代码中添加了一个中断调用,很难理解您的目标。你不应该用这个来解决问题。如果您可以尝试包装并添加一个项目,然后中断然后删除下一个项目并循环更多。这是你想要的吗?或者在成功的情况下,它应该继续下一次迭代吗?
答案 1 :(得分:0)
对于重新列表中的每个项目,尝试在行李中找到一个插槽,如果发现中断了for循环并移动到重新列表中的下一个项目
while (!recList.isEmpty()) {
int item = recList.remove(recList.size() -1);
for (int i= 0; i < baggedList.size(); i ++){
System.out.println("i = " + i + " Item = " + item);
if (tryToBag(item, i)){ //boolean method
addItem (item, i); //adds the item
}
break;
}
}
答案 2 :(得分:0)
我废弃了这个版本并开始了一个采用不同方法的新版本。