0 0

关于箱子和球的算法问题5

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

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

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


样本输入:

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

样本输出:

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

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

2   3 (2个球放入一个盒子,3个放入另一个盒子)
2013年6月14日 06:42

6个答案 按时间排序 按投票排序

0 0

采纳的答案

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

}

2013年6月14日 14:12
0 0

前面那个写错了点

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

2013年6月15日 14:34
0 0

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

2013年6月15日 14:30
0 0

运行结果


请输入球的数量: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

2013年6月14日 14:15
0 0

调用 :  k=2 , n=5

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

返回 :
5 0
4 1
3 2
  

2013年6月14日 11:08
0 0

static void BoxBall(int k, int n, int max, Stack<int> 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);
            }
        }

2013年6月14日 11:04

相关推荐

    3d版推箱子

    总结来说,3D版推箱子的算法设计涵盖了状态表示、搜索算法、可达性分析、碰撞检测、规则验证、记忆化搜索、优化剪枝和图形渲染等多个方面,这些技术的综合应用使得3D推箱子游戏既有挑战性,又具有良好的交互体验。

    RPG推箱子游戏

    2. **碰撞检测**:为了确保角色和箱子能正确地交互,需要实现精确的碰撞检测算法,如AABB(轴对齐边界框)或更复杂的OBB(有向边界框)。 3. **逻辑控制**:游戏中的每个动作(如移动、推箱子)都需要对应的逻辑...

    《信息学竞赛宝典-基础算法》视频讲解-第1章 模拟算法

    1.1.7猫和老鼠.wmv 1.1.2幽灵粒子.wmv 1.1.6计算机病毒.wmv 1.1.3平台上的小球.wmv 1.1.4字符串的展开.wmv 1.1.5序列变换.wmv 1.1.8推箱子.wmv 1.1.9奶牛的命运.wmv 1.1.1互送礼物.wmv 1.2.3立体图.wmv 1.2.4时间...

    易语言经典算法

    26. 箱子问题(贪婪法) 27. 寻找文件(递归法) 28. 求最大公约数(递归法) 29. 取不重复数(排除法) 30. 拉丁方 31. 波松瓦分酒 32. 皇后问题 33. 背包问题 34. 角谷猜想 35. 邮票组合 36. 贮油点 37. 分解质因数 38. ...

    算法导论笔记

    - **球与箱子**:分析球随机分配到多个箱子中的各种概率问题。 - **特征序列**:分析硬币连续正面朝上的期望长度。 - **在线雇佣问题**:提出了一种在线决策策略,旨在找到接近最优的应聘者,同时减少雇佣次数。 - ...

    哈工大高级算法公式总结,一直开卷可用

    12. 斯特林公式:斯特林公式给出了组合数的上界,即某个箱子里落入m个球的概率上界是e的M次幂除以M的阶乘。 13. k独立事件:k独立事件是指事件之间相互独立,且同时发生的概率是各自概率的乘积。 14. 相互独立事件...

    C语言常用算法

    087 三色球问题 088 马克思手稿中的数学题 089 配对新郎和新娘 090 约瑟夫问题 091 邮票组合 092 分糖果 093 波瓦松的分酒趣题 094 求π的近似值 095 奇数平方的有趣性质 096 角谷猜想 097 四方定理 098 ...

    冲刺NOIP2010模拟试题与解析(五)

    冲刺NOIP2010模拟试题与解析(五) 本资源摘要信息涉及到四个问题,分别是无穷序列、汤姆斯的天堂梦、克鲁斯的加...这四个问题都需要设计高效的算法来解决,需要考虑到问题的特点和限制条件,以求得最优的解决方案。

    Scratch小游戏.rar

    这个“Scratch小游戏.rar”压缩包包含了多个使用Scratch制作的小游戏,包括推箱子、连连看、贪吃蛇、打砖块、累加和计算、连连看以及冒泡排序等,这些游戏都是通过编写Scratch脚本来实现的。 1. **推箱子**:这是一...

    图形学课程大作业——3D推箱子小游戏

    在这个项目中,可能采用了轴对齐边界框(AABB)或包围球等简单碰撞检测方法,以确保推箱子时的物理行为合理。 基本光照模型是3D图形中的关键元素,它模拟了现实世界中的光线如何影响物体表面。项目中可能包含了点...

    HTML5 canvas小人推箱子小游戏特效代码

    这需要一个算法来检测每个箱子是否到达了正确的位置。这可能涉及到遍历所有箱子,比较其位置与小球位置,一旦所有箱子都满足条件,就宣告游戏过关。 游戏的实现还可能包含碰撞检测,确保小人或箱子不会穿过其他物体...

    易语言5.0自带源代码[经典数学算法集.rar]

    26.箱子问题(贪婪法) 27.寻找文件(递归法) 28.求最大公约数(递归法) 29.取不重复数(排除法) 30.拉丁方 31.波松瓦分酒 32.皇后问题 33.背包问题 34.角谷猜想 35.邮票组合 36.贮油点 37.分解质因数 38.任意进制转换...

    js 各类抽奖源码(大转盘、翻牌、开宝箱、刮刮乐、砸金蛋、仿双色球)等等,里面有上百个各式各样的抽奖源码

    6. **仿双色球抽奖**:仿双色球抽奖程序需要模拟真实的彩票摇号过程,包括红球和蓝球的选择。这需要编写算法来生成随机号码,同时可能需要实时更新和展示开奖结果。 这些源码对于开发者来说是极好的学习材料,可以...

    android2.0 游戏开发实战宝典ppt

    这类游戏通常需要使用数据结构来存储和解决复杂的逻辑问题。 胜利大逃亡和太空保卫战这类动作射击游戏,重点在于游戏循环的设计、子弹碰撞检测、敌机AI和粒子特效的实现。同时,音效和音乐的集成也是提升游戏体验的...

    第四次课PPT1

    在IT领域,尤其是在人工智能的研究和应用中,统计和概率理论是不可或缺的基础知识。这堂课主要回顾了古典概型和几何...理解和掌握这些概念,对于开发智能系统、优化算法性能以及解决现实世界中的复杂问题具有重要意义。

    Android2.0游戏开发实践宝典源代码

    推箱子游戏通常涉及复杂的逻辑算法,如A*寻路算法或深度优先搜索,用于解决游戏的可玩性和解谜过程。开发者可以从源代码中理解如何实现这些算法,以及如何在Android平台上实现触摸事件的响应和游戏状态的保存与加载...

    豆机:豆机模拟(又名 Plinko 或二项分布)-matlab开发

    1. **初始化参数**:设定球的数量、挡板的宽度、高度和数量,以及每个箱子的宽度。 2. **生成随机方向**:为每个球随机决定向左还是向右反弹,这可以通过生成0或1的随机数来实现,其中0代表向左,1代表向右。 3. *...

    AIPaper-2017Z8009061078-李中欢-贝叶斯定理及其应用1

    例如,在上述的箱子问题中,如果我们知道两个箱子的球颜色分布,然后进行了多次抽球,贝叶斯定理可以帮助我们根据抽到的球的颜色来判断当前是哪个箱子。 举个具体的例子,如果在第一次抽球中我们抽到了红球,根据...

Global site tag (gtag.js) - Google Analytics