4 solutions
-
1
题意:
设S是一个具有n个元素的集合,S=⟨a1,a2,……,an⟩S=⟨a1,a2,……,an⟩,现将S划分成k个满足下列条件的子集合S1,S2,……,SkS1,S2,……,Sk ,且满足:
1.Si≠∅Si=∅
2.Si∩Sj=∅Si∩Sj=∅ (1≤i,j≤k,i≠j1≤i,j≤k,i=j)
3.S1∪S2∪S3∪…∪Sk=SS1∪S2∪S3∪…∪Sk=S
则称S1,S2,……,SkS1,S2,……,Sk是集合S的一个划分。它相当于把S集合中的n个元素a1,a2,……,ana1,a2,……,an 放入kk个(0<k≤n<300<k≤n<30)无标号的盒子中,使得没有一个盒子为空。请你确定nn个元素a1,a2,……,ana1,a2,……,an 放入kk个无标号盒子中去的划分数S(n,k)S(n,k)。
代码:
#include<bits/stdc++.h> using namespace std; long long p(long long n,long long k){ if(n<k||k==0)return 0; if(k==n||k==n)return 1; return p(n-1,k-1)+k*p(n-1,k); } int main(){ long long n,k; cin>>n>>k; cout<<p(n,k); return 0; }
-
0
#include <bits/stdc++.h> using namespace std; int n, k; long long dfs(long long w,long long v) { //w:还剩多少元素,v:还剩多少个盒子没放 if (v == 0 || w < v) { //分完了或不能再分时返归0 return 0; } if (v == 1 || w == v) { //分够k个盒子或分到只剩一个时(剩下的放这个盒子里)返回1 return 1; } //(w-1,v-1):某一个数单独一个盒子装,其他已经放好了 //(w-1,v)*k:某一个数可以放任意盒子,有k种方法 return dfs(w - 1, v - 1) + dfs(w - 1, v) * v; } int main() { cin >> n >> k; cout << dfs(n, k); return 0; }
- 1
Information
- ID
- 800
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 3
- Tags
- # Submissions
- 56
- Accepted
- 29
- Uploaded By