1

我必须创建一个算法,该算法需要将n个行李袋(每个行李袋的重量不同)放入n 个容器中,每个容器可容纳 50 公斤。每个袋子按顺序装入一个容器中。

行李袋重量的示例字符串如下(每个数字代表一个袋子的重量):

16 24 25 3 20 18 7 17 4 15 13 22 2 12 10 5 8 1 11 21 19 6 23 9 14

装满行李的容器有两条规则:

  1. 一个集装箱可携带不超过 50(公斤)的行李
  2. 如果下一个(卸载的)袋子会导致容器超重,则将其放入下一个容器中

我的最终目标是打印每个容器的袋子重量清单。行李袋示例字符串的示例输出为:

Container 1:  16  24
Container 2:  25  3  20 
Container 3:  18  7  17  4
Container 4:  15  13 22
Container 5:  2   12 10  5  8  1  11  
Container 6:  21  19 6 
Container 7:  23  9  14

我当前的代码无法创建容器,我现在正在寻找一种更好的方法来做到这一点。

public static void insertBagsContainer() {
    ArrayList<ArrayList<Integer>> containerArray = new ArrayList<ArrayList<Integer>>();
    int tempSum = 0;
    int x=0;

    for(int i=0; i<bags.size()-1; i++){
        tempSum = 0;
        ArrayList<Integer> innerBags = new ArrayList<Integer>();
        while (tempSum<= containerWeight){
            tempSum+= bags.get(x);
            innerBags.add(bags.get(x));
            x++;
        }
        containerArray.add(innerBags);
    }
}
4

3 回答 3

0

我建议创建一个Container具有两个字段的类:List<Integer> containerand int currentWeight,然后是 a ,如果行李被插入,则相应boolean add(Integer luggage)地返回一个值。boolean然后,您可以List<Container> containers根据行李是否可以插入而相应地增长。

在代码中:

class Container {
    private static final int MAX_SIZE = 50;
    private List<Integer> container;
    private int currentWeight;
    //luggage should be of type Luggage as well, just using Integer for sample purposes
    public boolean add(Integer luggage) {
        //implement it accordingly...
    }
}

class Bags {
    List<Container> containerList;
    //again, it should be List<Luggage>, just for sample purposes
    public void process(List<Integer> luggage) {
        //implement accordingly...
    }
}

实施细节由您决定。

于 2013-11-05T03:31:54.007 回答
0

使用迭代器的经典示例。

public static void main(String[] args) {
    int maxWeight = 50;

    ArrayList<Integer> containerWeights = new ArrayList<Integer>();
    Integer[] weights = new Integer[] { 16, 24, 25, 3, 20, 18, 7, 17, 4, 15, 13, 22, 2, 12, 10, 5, 8, 1, 11, 21, 19, 6, 23, 9, 14 };

    Iterator<Integer> itr = Arrays.asList(weights).iterator();
    int current = itr.next(); //Get the first weight
    int containerWeight = 0;

    while(itr.hasNext()) {
        if(containerWeight + current > maxWeight) {
            containerWeights.add(containerWeight);
            containerWeight = current;
        } else {
            containerWeight += current;
        }
        current = itr.next();
    }
    containerWeights.add(current);
    System.out.println(Arrays.deepToString(containerWeights.toArray()));
}

打印:[40、48、46、50、49、46、14]

于 2013-11-05T04:17:33.807 回答
-1

只需将每个innerbags列表视为一个容器。

要打印出容器 1,您将打印出 中的袋子列表containerArray.get(0)

听起来像家庭作业,所以看看这是否能让你开始......

于 2013-11-05T03:32:03.813 回答