LeetCode 1601. 最多可达成的换楼请求数目(回溯+剪枝)
文章目錄
- 1. 題目
- 2. 解題
1. 題目
我們有 n 棟樓,編號從 0 到 n - 1 。每棟樓有若干員工。由于現在是換樓的季節,部分員工想要換一棟樓居住。
給你一個數組 requests ,其中 requests[i] = [fromi, toi] ,表示一個員工請求從編號為 fromi 的樓搬到編號為 toi 的樓。
一開始 所有樓都是滿的,所以從請求列表中選出的若干個請求是可行的需要滿足 每棟樓員工凈變化為 0 。
意思是每棟樓 離開 的員工數目 等于 該樓 搬入 的員工數數目。
比方說 n = 3 且兩個員工要離開樓 0 ,一個員工要離開樓 1 ,一個員工要離開樓 2 ,如果該請求列表可行,應該要有兩個員工搬入樓 0 ,一個員工搬入樓 1 ,一個員工搬入樓 2 。
請你從原請求列表中選出若干個請求,使得它們是一個可行的請求列表,并返回所有可行列表中最大請求數目。
示例 1:
示例 2:
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/maximum-number-of-achievable-transfer-requests
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。
2. 解題
數據規模比較小,直接暴力回溯,時間復雜度 O(n?2req.length)O(n*2^{req.length})O(n?2req.length)
class Solution {int max_satisfied = 0; public:int maximumRequests(int n, vector<vector<int>>& requests) {vector<int> count(n, 0);dfs(requests, count, 0, 0);return max_satisfied;}void dfs(vector<vector<int>>& requests, vector<int>& count, int idx, int satisfied){if(satisfied+requests.size()-idx <= max_satisfied)return;//剩余的假如都可以滿足,都不可能超過最大的,剪枝if(idx == requests.size()){for(int i = 0; i < count.size(); i++){if(count[i] != 0)return;}max_satisfied = max(max_satisfied, satisfied);return;}int from = requests[idx][0], to = requests[idx][1];count[from]--;count[to]++;dfs(requests, count, idx+1, satisfied+1);//選count[from]++;count[to]--;dfs(requests, count, idx+1, satisfied);//當前不選} };48 ms 8.8 MB
我的CSDN博客地址 https://michael.blog.csdn.net/
長按或掃碼關注我的公眾號(Michael阿明),一起加油、一起學習進步!
總結
以上是生活随笔為你收集整理的LeetCode 1601. 最多可达成的换楼请求数目(回溯+剪枝)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 04.卷积神经网络 W1.卷积神经网络
- 下一篇: LeetCode 1320. 二指输入的