一个面试题

这个题目估计类似一些比赛用的题目。
现在先说一个。
说是有篮子,可以装球,篮子有一定的容量。问题是,给定篮子数量,篮子容量,还有小球数,求出有几种装法。(原文是英文的)
这里还有些限制,比如篮子数不会多余5个,小球不多于50个等。
例子:
篮子数 容量 小球数
2 5 2
结果: 3
也就是 (0,2),(2,0),(1,1)这三种组合

2 5 11
结果 0
这说明篮子不够装下那么多小球。

相信大家现在应该知道题意了。那么我们就开始算法吧。
我首相想到,这种排列组合的算法,使用循环来做。
那么,仔细一看,发现,有几个篮子,我们就要做几个大循环。每个循环里面,再通过尝试增加小球数,然后计算是否装满。
实际上就是枚举所有装球情况,然后判断符合要求的。

可是问题来了,写代码的时候要明确循环,比如,几个篮子,就要几个for语句。
这些问题来了。不能这样控制。很快,递归的思想便浮上水面。
我们先考虑n-1个篮子的情况。也就是第0个篮子(从0开始),在容量或者最小值之间循环(取决于容量和所需装小球数量比较得到的最小值)。
然后再计算当前情况是否符合要求。

public void getWays(int baskets,int capacity,int balls){
int bas[] = new int[baskets];
int c = capacity;
int bal = balls;
if(baskets <= 0)return ;
if(balls <= 0) return ;
if(baskets*c < balls) return ;
//减少循环次数
int min = c < bal?c:bal;

for(bas[0]=0; bas[0] <= min;bas[0]++){ //这里比较难理解。注意传入的递归小球数,已经做了删减。
//因为在bas[0]中已经装入了小球,所以下一次算只要减去就好
getWays(baskets-1,capacity,balls-bas[0]);
//计算本次情况
//add函数只是判断当前bas中的数值相加是否等于balls
if(add(bas,balls)){
//这里的r应该作为全局变量。
r++;
}
}
}

public boolean add(int b[],int m){
int sum = 0;
for(int i = 0; i< b.length;i++){
sum += b[i];
}
if(sum == m){
return true;
}
return false;
}


写出代码后,我都吃惊,这个代码还真短。不过我面试的时候,还是做错了。
看来递归真的是很神奇。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值