java

淘宝的实习生招聘笔试,有一道编程题目:有N个鸡蛋和M个篮子,把蛋放到M个篮子里,每个篮子都不能为空,并且满足对于任意一个不超过N的正整数,都能由某几个篮子内蛋的数量相加得到。写出程序,使得输入一个(N,M),输出所有可能的分配情况。

我这里主要是考虑的递归调用:java代码如下:

package com.gao.test.compile;

public class AppleTest {
public static void main(String[] args) {

int n = 10;//n是指鸡蛋的个数
int m = 4;//m是篮子的个数
int[] a = new int[m];//数组a,用来表示每个篮子放多少的鸡蛋(比如:a[0]代表第一个篮子放了几个鸡蛋)

//a[0] = 1;//这里默认第一个篮子放1个鸡蛋
for(int i = (n-m+1);i >=1;--i){//这里是对篮子从后往前进行填充,首先最后一个篮子尽可能多的放鸡蛋
//(比如:n = 9,m= 5;则第五个篮子最多放5个鸡蛋,前面的都是放一个鸡蛋)
a[m-1] = i;//这里是指最后一个篮子尽可能的放的鸡蛋的个数
egg(n-i,m-1,a);//对剩下的n-i个鸡蛋,m-1个篮子进行递归
}
}
public static void egg(int n,int m,int[] a){
for(int i = min((n-m+1),a[m]);i >= 1;--i){//这里保证了a[i] < a[i+1],因为我们是从后往前进行分配的,后面的一定要大于或者等于前面的
if(n < m){//如果出现鸡蛋的个数小于篮子的个数,表示分配不合理,重新进行分配
continue;
}else if(n == m){//这时剩下的鸡蛋刚好等于篮子的个数,则只能每个篮子放一个鸡蛋
for(int j = m - 1;j >= 0;--j){
a[j] = 1;
}
m = 1;//表示走到了最后
n = 0;
}
if(m == 1){//这里只剩下一个篮子的时候
if(n > 1){
//a[m-1] = n;
continue;
}else{//输出结果
for(int k = 0;k<a.length;++k){
System.out.print(a[k]+",");
}
System.out.println();
return;
}
}else{//进行递归的迭代
a[m-1] = i;
egg(n-i,m-1,a);
}
}
}
public static int min(int x,int y){
return x <= y ? x : y;
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值