问题描述:你有几个同样的球,你希望把它放到几个篮子里。 每个篮子有相同的容量。 给出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;
}
}