2 solutions

  • 2
    @ 2021-11-14 15:36:37
    #include <bits/stdc++.h>
    using namespace std;
    int dfs(int m, int n) {
    	if (m == 0 || n == 1) return 1;//没有桃桃或者只有一个盘子搜索结束
    	else if (m < n) return dfs(m, m);//每个桃桃占一个盘子则最多只能占有n个盘子
    	//若放满盘子,则可以将所有盘子的桃桃各拿掉一个方案数不变,有f1(m,n)=f(m-n,n)
    	//若不放满盘子,则可以把空盘子直接拿掉一个再做考虑有f2(m,n)=f(m,n-1)
    	//所以f(m,n)=f1(m-n,n)+f2(m,n-1)
    	else return dfs(m - n, n) + dfs(m, n - 1);
    }
    int main() {
    	int t, m, n;
    	cin >> t;
    	while (t--) {
    		cin >> m >> n;
    		cout << dfs(m, n) << endl;//开整
    	}
    	return 0;
    }
    
    • 2
      @ 2021-11-13 16:09:38

      将M个相同桃桃放在N个相同的盘子里,盘子可以为空,求方案数。

      • 边界条件:没有桃桃或者只有一个盘子的时候,方案数为1

      • 若n>m,那就算每个桃桃占一个盘子也最多只能占有n个盘子。f(m,n)=f(m,m);

      • 对其余情况f(m,n),分为放满盘子和不放满盘子两种情况。

      ① 若放满盘子,则可以将所有盘子的桃桃各拿掉一个,方案数不变。f1(m,n)=f(m-n,n)

      ② 若不放满盘子,则可以把空盘子直接拿掉一个再做考虑f2(m,n)=f(m,n-1)

      所以有f(m,n)=f(m-n,n)+f(m,n-1)

      • 1

      Information

      ID
      162
      Time
      1000ms
      Memory
      256MiB
      Difficulty
      5
      Tags
      # Submissions
      28
      Accepted
      13
      Uploaded By