
public class Boxes {

	static int BoxSizes[] = {25, 21, 10, 5, 1};
	static int[] Counts;
	static int[] LastBox;
	
	public static int NumBoxes( int items) {
		if (Counts[items] > 0)
			return Counts[items];
		int min = items;
		int bestBox = 1;
		for (int j = 0; j < BoxSizes.length; j++) {
			if (BoxSizes[j] < items) {
				int t = 1+ NumBoxes(items-BoxSizes[j]);
				if (t < min) {	
					min = t;
					bestBox = BoxSizes[j];
				}
			}
		}
		Counts[items] = min;
		LastBox[items] = bestBox;
		return min;
	}
	
	public static void Print( int items ) {
		while (items > 0) {
			System.out.printf( "%d ", LastBox[items]);
			items -= LastBox[items];
		}
		System.out.println();
	}
	
	public static void main(String[] args) {
		Counts = new int[50];
		LastBox = new int[50];
		for (int i = 0; i < BoxSizes.length; i++ ) {
			int size = BoxSizes[i];
			Counts[size] = 1;
			LastBox[size] = size;
		}	
		for (int i = 10; i < 50; i++) {
			System.out.printf( "%d: %d\n", i, NumBoxes(i) );
			Print(i);
		}	
	}

}
