题目描述
把M个同样的珠子放在N个同样的盒子里,允许有的盒子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。
输入
第一行是测试数据的数目t$(0 <= t <= 20)$。以下每行均包含二个整数M和N,以空格分开。$0<=M$,$N<=25$。
输出
对输入的每组数据M和N,用一行输出相应的K。
样例输入
样例输出
题解
C++
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| #include<bits/stdc++.h>
using namespace std; using ll = long long; #define endl '\n' ll dp[26][26];
ll f(int m, int n) { if (dp[m][n] != 0)return dp[m][n]; if (m <= 1 n == 1)return dp[m][n] = 1; if (m < n)return dp[m][n] = f(m, m); return dp[m][n] = f(m, n - 1) + f(m - n, n);
}
int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); int T; cin >> T; while (T--) { int m, n; cin >> m >> n; cout << f(m, n) << endl; } return 0; }
|
Java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| import java.util.Scanner; public class Main { public static void main(String []ages) { Scanner sc=new Scanner(System.in); int n=sc.nextInt(); while(n--!=0) { int a=sc.nextInt(); int b=sc.nextInt(); System.out.println(count(a,b)); } } static int count(int apple,int plant) { if(apple==0plant==1) return 1; if(plant>apple) { return count(apple,apple); } else { return (count(apple,plant-1)+count(apple-plant,plant)); } } }
|