Computer Science 225
Advanced Programming
Spring 2017, Siena College
BinPacking BlueJ Project
Click here to download a BlueJ project for BinPacking.
BinPacking Source Code
The Java source code for BinPacking is below. Click on a file name to download it.
import java.util.ArrayList;
import java.util.Scanner;
/**
* Example BinPacking: Bin packing demonstration of recursion.
*
* @author Jim Teresco, Siena College, Computer Science 225, Spring 2017
*
*/
public class BinPacking {
/**
* recursive method to try to do bin packing on the given items in a given size bin
*
* @param items the ArrayList of item sizes
* @param size the size of the bin to fit
*
* @return an ArrayList of item sizes to include in solution, or null if no solution
*/
public static ArrayList<Integer> binPack(ArrayList<Integer> items, int size) {
// base case: 0 size (we'll fill with items as we back out of the recursion)
if (size == 0) {
return new ArrayList<Integer>();
}
// general case: we need to add something, so let's try each item that fits, and we're done
// if we find any solutions
for (int itemNum = 0; itemNum < items.size(); itemNum++) {
int item = items.get(itemNum);
if (item <= size) {
// it's a candidate, so let's attempt
items.remove(itemNum); // will remove by position
ArrayList<Integer> answer = binPack(items, size - item);
items.add(itemNum, item); // put it back for future loop iterations
// did we find an answer?
if (answer != null) {
answer.add(item);
return answer;
}
}
}
// no solutions found using any of the items, so we return null to indicate failure
return null;
}
/**
* main method to run an instance of the bin packing problem
*
* @param args not used
*/
public static void main(String[] args) {
// storage for our target bin size and list of items to pack therein
int binSize;
ArrayList<Integer> items = new ArrayList<>();
Scanner keyboard = new Scanner(System.in);
// some better error checking here would be good
System.out.print("How large is your bin? ");
binSize = keyboard.nextInt();
System.out.println("Enter the sizes of items, 0 to end.");
int nextItem = keyboard.nextInt();
while (nextItem != 0) {
items.add(nextItem);
nextItem = keyboard.nextInt();
}
// call the recursive method to get started
ArrayList<Integer> answer = binPack(items, binSize);
// report result
if (answer == null) {
System.out.println("No solution.");
}
else {
System.out.println("Take items of sizes: " + answer);
}
}
}