算法设计:将袋子插入有限尺寸的容器中

时间:2013-11-05 03:25:02

标签: java arrays algorithm sorting

我必须创建一种算法,该算法需要将 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(kg)的行李
  2. 如果下一个(卸下的)行李将导致集装箱超重,请将其放入下一个集装箱

  3. 我的最终目标是打印每个容器的袋子重量列表。行李箱示例字符串的示例输出将是:

    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);
        }
    }
    

3 个答案:

答案 0 :(得分:0)

我建议您创建一个Container类,其中包含两个字段:List<Integer> containerint currentWeight,然后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...
    }
}

实施细节由您决定。

答案 1 :(得分: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]

答案 2 :(得分:-1)

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

要打印出容器1,您需要在containerArray.get(0)打印出行李列表。

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