
int dp[1<<15];//dp[state] 上完状态为state的课程需要多少学期
int chk[20];//表示课程i所需要先修课程的掩码
class Solution {
public:
void dfs(int x,int m,int k,int v,int sta,vector<int>&cc)
{
if(m-x<k) return;
if(k==0||x>=m){
if(dp[sta]==-1||dp[sta]>v){
dp[sta]=v;
}
return;
}
dfs(x+1,m,k-1,v,sta|(1<<cc[x]),cc);
dfs(x+1,m,k,v,sta,cc);
}
int minNumberOfSemesters(int n, vector<vector<int>>& dependencies, int k) {
memset(dp,-1,sizeof dp);
memset(chk,0,sizeof chk);
int lim=1<<n;
dp[0]=0;
for(auto e:dependencies){
int x=e[0]-1;
int y=e[1]-1;
chk[y]=chk[y]|(1<<x);
}
vector<int>cc;
for(int s=0;s<lim;s++){
if(dp[s]==-1) continue;
cc.clear();
for(int i=0;i<n;i++){
if(((s>>i)&1)==1) continue;
if((chk[i]&s)!=chk[i]) continue;
cc.push_back(i);
}
int m=cc.size();
dfs(0,m,min(m,k),dp[s]+1,s,cc);
}
return dp[lim-1];
}
};