N个鸡蛋放到M个篮子中,篮子不能为空

时间:2022-05-08 17:40:11
分析:此题和前面有一题 
N个整数(1.2.3...N)中任取K个,使得和为M ,求出所有情况
比较类似 , 但是也有所不同,首先每个篮子放得鸡蛋理论上最多可以到N,其实每个篮子都必须有鸡蛋



package com.java.ly2011.Semptember;

/**
* n个鸡蛋m个篮子 每个篮子必须有鸡蛋
* @author liuyang
*
*/
public class N_eggs_M_baskets {
public static void main(String[] args) {
//getResult(6, 3);

easyWay(6, 3, 1, new StringBuffer());

}

public static void easyWay(int N , int M ,int start ,StringBuffer path){
if(N==0)
System.out.println( path );

if(start<=N&&M==1){
path.append(N);
System.out.println( path );
path.setLength(path.length()-1);
return;
}

for(int i = start; i<=N-1; i++){//此处i<=N-1 的意思就是最多取到N-1因为如果你取满了,后面的就必然有空的,此题一定要N个篮子都用上
//取N的话代表的意思就是最多N个篮子 ,可以有的不用(不放鸡蛋)

easyWay(N-i, M-1, i, path.append(i));
path.setLength(path.length()-1);

}
}


public static void getResult(int N, int M){

getSolution(N-M, M, 1, new StringBuffer());

}

public static void getSolution(int N , int M ,int start ,StringBuffer path){

if(N==0){
StringBuffer newpath = new StringBuffer(path);
for(int j =1;j<=M;j++)
newpath.append(0);
for(int i = 0; i<newpath.length();i++)
System.out.print( ((newpath.charAt(i)-'0')+1) +" ");
System.out.println();

return;
}


for(int i= start;i<=N;i++){
if(M==1){
path.append(N);
for(int j = 0; j<path.length();j++)
System.out.print( ((path.charAt(j)-'0')+1)+" ");
System.out.println();
path.setLength(path.length()-1);
break;

}
else{
getSolution(N-i, M-1, i, path.append(i));
path.setLength(path.length()-1);
}
}
}
}