把m个同样的苹果放在n个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?
注意:如果有7个苹果和3个盘子,(5,1,1)和(1,5,1)被视为是同一种分法。
深度优先遍历,使用set来确保唯一性。每次检查时需要将vec排序
#include <iostream>
#include<vector>
#include <set>
#include <algorithm>
using namespace std;
set<vector<int>> myset;
void work(int m,int n,int level,vector<int>&vec);
int cnt=0;
int main() {
int m,n;
cin>>m>>n;
int sum=0;
vector<int>vec;
work(m,n,1,vec);
cout<<cnt<<endl;
}
void work(int m,int n,int level,vector<int>&vec){
if(level==n){
vec.push_back(m);
sort(vec.begin(),vec.end());
if(myset.find(vec)==myset.end()){
cnt++;
myset.insert(vec);
}
vec.erase(find(vec.begin(),vec.end(),m));
return;
}
for(int i=0;i<=m;i++){
vec.push_back(i);
work(m-i,n,level+1,vec);
vec.erase(find(vec.begin(),vec.end(),i));
}
}