思路: ①最少的盘子放了一个,这样每个盘子至少一个,n个盘子先放上n个,剩下的m-n个可以随便放 ②最少的盘子没有放,这样剩下的n-1个盘子还是随便放m个 import java.util.Scanner;public class MNAppleTest { public static void main(String[] args) { Scanner in = new Scanner(System.in); int N, M; // M Apple, N Disk M = in.nextInt(); N = in.nextInt(); System.out.print("共有"+cal(M, N)+"种结果"); } private static int cal(int m, int n) { if (m < 0) return 0; if (m == 0 || n == 1) return 1; return cal(m - n, n) + cal(m, n - 1); }}
貌似不适用,你可以试试,不符合LZ要求
我说的几乎一摸一样并不是完全一样
这题就是简单的for循环+排除的话那就有点可悲了,比如我说一种
构建List存储所有可能
List<String>
for(遍历a的可能,0到10){
for(遍历b的可能,0到10-a){
for(遍历c的可能,0到10-a-b){
//这里就是一个排除的功能,都建对象,把最大的那个数放到第一位里,最小的放到最后面,然后把这数字构建成字符串,String,判断List中是否有,如果没有添加进去就行了。
}
}
}
//最后统计List长度就ok了。我想说的和我那个例子有极大相似性,是想说能否阻断式的去计算,而不是用这种遍历了所有可能后的排除。
①最少的盘子放了一个,这样每个盘子至少一个,n个盘子先放上n个,剩下的m-n个可以随便放
②最少的盘子没有放,这样剩下的n-1个盘子还是随便放m个
import java.util.Scanner;public class MNAppleTest { public static void main(String[] args) { Scanner in = new Scanner(System.in);
int N, M; // M Apple, N Disk
M = in.nextInt();
N = in.nextInt();
System.out.print("共有"+cal(M, N)+"种结果");
} private static int cal(int m, int n) {
if (m < 0)
return 0;
if (m == 0 || n == 1)
return 1;
return cal(m - n, n) + cal(m, n - 1); }}