yingrenzhe68 2013-06-14 06:42
浏览 478
已采纳

关于箱子和球的算法问题

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

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

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

样本输入:

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

样本输出:

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

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

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

  • 写回答

6条回答 默认 最新

  • sanyo0714 2013-06-14 14:12
    关注

    [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]

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)

报告相同问题?

悬赏问题

  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 牛顿斯科特系数表表示