我们有 n 栋楼,编号从 0 到 n - 1 。每栋楼有若干员工。由于现在是换楼的季节,部分员工想要换一栋楼居住。
给你一个数组 requests ,其中 requests[i] = [fromi, toi] ,表示一个员工请求从编号为 fromi
的楼搬到编号为 toi 的楼。一开始 所有楼都是满的,所以从请求列表中选出的若干个请求是可行的需要满足 每栋楼员工净变化为 0 。意思是每栋楼 离开 的员工数目 等于
该楼 搬入 的员工数数目。比方说 n = 3 且两个员工要离开楼 0 ,一个员工要离开楼 1 ,一个员工要离开楼 2
,如果该请求列表可行,应该要有两个员工搬入楼 0 ,一个员工搬入楼 1 ,一个员工搬入楼 2 。请你从原请求列表中选出若干个请求,使得它们是一个可行的请求列表,并返回所有可行列表中最大请求数目。
class Solution {
int ans = 0,len=0;
int res = 0;
public int maximumRequests(int n, int[][] requests) {
//回溯法
int[] delta = new int[n];
len = requests.length;
dfs(0,requests,delta,0);
return res;
}
public void dfs(int index,int[][] requests,int[] delta,int cnt){
if(cnt+len-index<res) return;
if(index>=len){
for(int i=0;i<delta.length;i++){
if(delta[i]!=0){
return;
}
}
res=Math.max(cnt,res);
return;
}
//取当前第index的请求
delta[requests[index][0]]-=1;
delta[requests[index][1]]+=1;
dfs(index+1,requests,delta,cnt+1);
//不取当前第index的请求
delta[requests[index][0]]+=1;
delta[requests[index][1]]-=1;
dfs(index+1,requests,delta,cnt);
}
}