提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
题目要求
请你确定n个元素a1,a2,……,an放入k个无标号盒子中去的划分数S(n,k)。
一、解题思路
对于n个数划分为k个非空集合,很自然想到DFS(深度优先搜索)算法.
但这题只有DFS是不够的,因此需要记忆化
函数原型可以是:int dfs(int n,int m).分3种情况讨论
n == 0或者m == 0或者n < m 这种情况下不存在方案直接返回0
n == m的时候只有一种方案,返回1
否则: 返回先单独取一份的情况
二、AC代码
#include <bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
using ll = long long;
ll cnt[35][35];
ll dfs(ll n,ll m);
int main()
{
IOS;
ll n,m; cin >> n >> m;
cout << dfs(n,m) << "\n";
return 0;
}
ll dfs(ll n,ll m)
{
if(n == 0 || m == 0) return 0;
if(n < m) return 0;
if(n == m) return 1;
if(cnt[n][m]) return cnt[n][m];
return cnt[n][m] = dfs(n-1,m) * m + dfs(n-1,m-1);
}
注意答案会爆int
---
941

被折叠的 条评论
为什么被折叠?



