Untitled

 avatar
unknown
c_cpp
14 days ago
1.9 kB
4
Indexable
#include <vector>
#include <functional>
using namespace std;

class Solution {
public:
    int minTransfers(vector<vector<int>>& debts) {
        int n = 0;
        for (auto& d : debts) {
            int from = d[0], to = d[1];
            n = max(n, max(from, to) + 1);
        }
        vector<long long> balance(n, 0);
        for (auto& d : debts) {
            int from = d[0], to = d[1];
            long long amount = d[2];
            balance[from] += amount;
            balance[to] -= amount;
        }
        vector<long long> nums;
        for (long long x : balance) {
            if (x != 0) {
                nums.push_back(x);
            }
        }
        if (nums.empty()) {
            return 0;
        }
        int m = nums.size();
        vector<long long> sum_mask(1 << m, 0);
        for (int mask = 0; mask < (1 << m); ++mask) {
            for (int i = 0; i < m; ++i) {
                if (mask & (1 << i)) {
                    sum_mask[mask] += nums[i];
                }
            }
        }
        vector<int> dp(1 << m, -1);
        dp.back() = 0; // When all elements are used, base case
        function<int(int)> solve = [&](int mask) {
            if (dp[mask] != -1) {
                return dp[mask];
            }
            int available = ((1 << m) - 1) ^ mask;
            int max_val = 0;
            for (int subset = available; subset != 0; subset = (subset - 1) & available) {
                if (sum_mask[subset] == 0) {
                    int new_mask = mask | subset;
                    int current = 1 + solve(new_mask);
                    if (current > max_val) {
                        max_val = current;
                    }
                }
            }
            return dp[mask] = max_val;
        };
        int max_subsets = solve(0);
        return m - max_subsets;
    }
};
Leave a Comment