一、题目描述
把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。
输入
第一行是测试数据的数目t(0 <= t <= 20)。以下每行均包含二个整数M和N,以空格分开。1<=M,N<=10。
输出
对输入的每组数据M和N,用一行输出相应的K。
样例输入
1
7 3
样例输出
8
二、题解
方法一:暴搜
设 a 为苹果数,b 为篮子数,情况列举如下:
a = 1 || b == 1
时:- 把仅有的一个苹果放到某一个篮子。
- 或者把所有苹果放到仅有的一个篮子。
b > a
时,必定有 b-a 个篮子是空着的,这些篮子不影响摆放我的选择,因为我最多只能让 a 个篮子有苹果。b <= a
时,可分为两种情况:a = b
时,其实这里有很 n 多种选择:- 让篮子空:但是为了做到疏而不漏我每次至多只让一个篮子空着。
- 让篮子不空:或者每个篮子都放满。
b < a
时, 也有两种选择:- 让篮子空:但是为了做到疏而不漏我每次至多只让一个篮子空着。
- 让篮子不空,先让 b 个篮子里各有 1 个苹果,剩下的 a-b 个苹果另做打算。
import java.util.*;
import java.math.*;
import java.io.*;
public class Main{
static boolean[] vis;
static int res;
private static int dfs(int a, int b) {
if (a == 1 || b == 1)
return 1;
if (a == b)
return dfs(a, b-1) + 1;
if (a < b)
return dfs(a, a);
if (a > b)
return dfs(a, b-1) + dfs(a-b, b);
}
public static void main(String[] args) throws IOException {
Scanner sc = new Scanner(new BufferedInputStream(System.in));
BufferedWriter w = new BufferedWriter(new OutputStreamWriter(System.out));
int t = sc.nextInt();
while (t-- > 0) {
int a = sc.nextInt(); //app
int b = sc.nextInt(); //篮子
System.out.println(dfs(a, b));
}
}
}
复杂度分析
- 时间复杂度: ,
- 空间复杂度: ,
方法二:dp
代办…
复杂度分析
- 时间复杂度: ,
- 空间复杂度: ,