球和篮子问题

问题描述:你有几个同样的球,你希望把它放到几个篮子里。 每个篮子有相同的容量。 给出int 型的baskets,代表篮子的数量。 给出 int型的 capacity,代表每个篮子的最大容量。 给出 int型的balls,表示归类到篮子里的球的数量。 返回值是把球归类到篮子里的方式的数量(count)。 如果不能完全存放到篮子中,无法划分,返回 0

思路分析:用递归的方法向篮子里面放球,例如有2个篮子,2个球,篮子的最大容量为2,刚开始时,两个篮子都有两种选择,就是0个,1个或者2个,那我们可以先从第一个篮子开始放,当第一个篮子放0个球时,第二个篮子可以放0个,1个或者两个,而当第二个篮子放0个球时,两个篮子的球总数不等于球的总数不满足提题意,放1个球时也不满足提议,第二个篮子的三种选择中只有选择放2个满足题目要求,这时可以让count+1;当第一个篮子放1个球时,lan第二个篮子也有三种选择,但只有第二个篮子放1个球时满足题意,这时让count+1;当第一个篮子放2个球时,lan第二个篮子也有三种选择,但只有第二个篮子放0个球时满足题意,这时让count+1;递归结束,返回count即可

package _递归;
public class _球和篮子 {
	int count=0;
	int baskets,capacity,balls;
	int[] bas;
	public int countWays(int baskets, int capacity, int balls) {
		if (baskets*capacity < balls) {
			return 0;
			}
		this.baskets=baskets;
		this.balls=balls;
		if (balls < capacity)//若是球的数量小于篮子的容量,那每个篮子最多就只能装balls个球,既可以认为篮子的容量就等于balls
			capacity = balls;
		this.capacity = capacity;
		bas = new int[baskets];//用该数组来记录每个篮子放了几个球
		
		//从第0个篮子开始放
		putBalls(0);
		return count;
	}
	
	//往篮子里放球的方法
	void putBalls(int n) {//n代表是第几个篮子
		//检测是不是到达最后篮子
		if (n == baskets) {
			if(getSumBalls() == balls)
				count++;//到达最后一个篮子,并且球也已经装完了,那这就是一种方法
			return;
		}
		//给第n个篮子放球,并且从0->capacity
		for (int i = 0;i <= capacity;i++) {//i表示球的个数
			bas[n] = i;
			putBalls(n+1);//递归放球
		}
	}
	//得到当前所有篮子里的所有球的总和
	int getSumBalls() {
		int sum=0;
		for (int i = 0;i < baskets;i++)
			sum += bas[i];
		return sum;
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值