关于箱子和球的算法问题

有k个完全相同的盒子,必须把n个球放入盒子中。假设箱子里能放入无限多的球,唯一的限制是每个球必须放入一个盒子中。请打印出球放入盒子里的所以可能情况,如果不能得到任何结果,请打印错误。

输入:
球的数量n,盒子的数量k

输出:
球放入盒子的所以可能情况,如果输入不正确,请打印错误。

样本输入:

5 2 (第一个为球的数量n,第二个为盒子的数量k)

样本输出:

0 5 (5个球全部放入一个盒子,另一个盒子为空)

1 4 (1个球放入一个盒子,4个放入另一个盒子)

2 3 (2个球放入一个盒子,3个放入另一个盒子)

[code="java"]
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;

public class aatest {

/**
 * @param args
 * @throws IOException
 */
public static void main(String[] args) throws IOException {
    // TODO Auto-generated method stub
    System.out.print("请输入球的数量:");
    BufferedReader boll = new BufferedReader(new InputStreamReader(
            System.in));
    String bollNumStr = null;
    bollNumStr = boll.readLine();

    System.out.print("请输入箱子的数量:");
    BufferedReader box = new BufferedReader(
            new InputStreamReader(System.in));
    String boxNumStr = null;
    boxNumStr = box.readLine();
    System.out.println("\n");

    int bollNum = -1;
    int boxNum = -1;

    try {
        bollNum = Integer.valueOf(bollNumStr);
    } catch (NumberFormatException e) {
        System.out.println("输入球的数量错误,数量不是整数");
    } catch (Exception e) {
        e.printStackTrace();
    }

    try {
        boxNum = Integer.valueOf(boxNumStr);
    } catch (NumberFormatException e) {
        System.out.println("输入箱子的数量错误,数量不是整数");
    } catch (Exception e) {
        e.printStackTrace();
    }

    if (bollNum != -1 && boxNum != -1) {
        System.out.println("球的数量是:" + bollNum);
        System.out.println("箱子的数量是:" + boxNum);
        ArrayList<String> list = new ArrayList<String>();

        if (boxNum < 2) {
            System.out.println(bollNum);
        } else {
            list = twoBox(bollNum, 0, list);

            for (int i = 0; boxNum - 2 > i; i++) {
                list = allBox(list);
            }

            for (String ss : list) {
                System.out.println(ss);
            }
        }

    }
}

/**
 * 将传入的list的每一个元素的第一个数拆分成两个数,并重组数组
 * @param list
 * @return 重组后的数组
 */
public static ArrayList<String> allBox(ArrayList<String> list) {
    ArrayList<String> listback = new ArrayList<String>();
    for (String s : list) {
        StringBuffer sbs = new StringBuffer(s);
        String[] ss = s.split(" ");
        int i = Integer.valueOf(ss[1]);
        ArrayList<String> partlist = new ArrayList<String>();
        partlist = twoBox(Integer.valueOf(ss[0]) - i, i, partlist);
        for (String str : partlist) {
            if (Integer.valueOf(str.split(" ")[0]) >= i)
                listback.add(str + " " + sbs.substring(ss[0].length() + 1));
        }
    }
    return listback;
}

/**
 * 将一个数分成两数,并组成一个数据(例如:5   分成[5 0,4 1,3 2])
 * @param first
 * @param second
 * @param list
 * @return 组合好的list
 */
public static ArrayList<String> twoBox(int first, int second,
        ArrayList<String> list) {
    list.add(first + " " + second);
    if (first > second + 1) {
        list = twoBox(first - 1, second + 1, list);
    }
    return list;
}

}

[/code]

static void BoxBall(int k, int n, int max, Stack stack, int sum)
{
if (k == 0)
{
Console.WriteLine("box count can't be 0");
return;
}

        if (max == 0)
        {
            Console.WriteLine("ball count can't be 0");
            return;
        }

        if (sum == 0 && stack.Count() == k)
        {
            foreach (var i in stack)
            {
                Console.Write(i + " ");
            }

            Console.WriteLine();
        }

        if (n <= max && sum > 0)
        {
            stack.Push(n);

            BoxBall(k, n + 1, max, stack, sum - n);

            stack.Pop();

            BoxBall(k, n + 1, max, stack, sum);
        }
    }

调用 : k=2 , n=5

Stack stack = new Stack();
BoxBall(2, 0, 5, stack, 5);

返回 :
5 0
4 1
3 2

运行结果

请输入球的数量:6
请输入箱子的数量:4

球的数量是:6
箱子的数量是:4
6 0 0 0
5 1 0 0
4 2 0 0
3 3 0 0
4 1 1 0
3 2 1 0
2 2 2 0
3 1 1 1
2 2 1 1

[code="java"]
public class BoxAndBall
{
static int[]box;
public static void main(String[] args)
{
int m=4,n=10;
box = new int[m];
divide(0,n);
}

public static void divide(int index,int ball){
    for(int i=0;i<=ball;i++){
        if(index==box.length){
            for(int j=0;j<box.length;j++){
                System.out.print(box[j]+"\t");
            }
            System.out.println();
            return ;
        }
        box[index]=i;
        divide(index+1,ball-i);
    }
}

}
[/code]

前面那个写错了点
[code="java"]
public class BoxAndBall
{
static int[]box;
public static void main(String[] args)
{
int m=4,n=10;
box = new int[m];
divide(0,n);
}

public static void divide(int index,int ball){
    for(int i=0;i<=ball;i++){
        if(index==box.length){
            box[index-1]=ball;
            for(int j=0;j<box.length;j++){
                System.out.print(box[j]+"\t");
            }
            System.out.println();
            return ;
        }
        box[index]=i;
        divide(index+1,ball-i);
    }
}

}
[/code]