[Leetcode] 698: Разделить на k равных подмножеств

ежедневный прогресс

  • Сокращение: избегайте некоторых ненужных процессов обхода, оценивая.
    • Сокращение осуществимости: вернуться, когда решение неосуществимо.
    • Оптимальное сокращение: возврат, когда решение схемы не может быть лучше, чем текущее оптимальное решение.

тема

Дан массив целых чисел numsи положительное целое число k, найдите, можно ли разбить массив на kнепустые подмножества, все суммы которых равны.

  • Пример 1:
    • Введите: nums = [4, 3, 2, 3, 5, 2, 1],k = 4
    • выход:True
    • Объяснение: Его можно разделить на 4 подмножества (5), (1,4), (2,3), (2,3) равные сумме.
  • Пример 2:
    • ввод: nums = [1,2,3,4],k = 3
    • выход:false
  • намекать:
    • 1 <= k <= len(nums) <= 16
    • 0 < nums[i] < 10000
    • Частота каждого элемента находится в диапазоне [1,4]

Источник: LeetCode
Ссылка: https://leetcode.cn/problems/partition-to-k-equal-sum-subsets
Авторские права принадлежат Leetcode Network. Эта статья предназначена только для личного изучения, некоммерческого использования.

отвечать

Примите идею обхода в глубину и обрезки и используйте жадную стратегию.

class Solution {
    
    
    int[] solu_nums;
    int solu_k, len, key;

    public boolean canPartitionKSubsets(int[] nums, int k) {
    
    
        solu_nums = nums;
        solu_k = k;
        len = nums.length;

        int sum = 0;
        for (int num : nums){
    
    
            sum += num;
        }
        if (sum % k != 0)
            return false;
        key = sum / k;
        Arrays.sort(solu_nums);

        boolean[] visited = new boolean[len];
        Arrays.fill(visited, false);

        boolean ans = dfs(len-1, 0, 0, visited);
        return ans;
    }

    public boolean dfs(int idx, int cal, int times, boolean visited[]){
    
    
        if (times == solu_k)
            return true;
        if (cal == key)
            return dfs(len-1, 0, times+1, visited);
        
        for (int i = idx; i >= 0; i--){
    
    
            if (visited[i] == true || cal + solu_nums[i] > key)
                continue;

            visited[i] = true;
            boolean ans = dfs(idx-1, cal+solu_nums[i], times, visited);

            if (ans)
                return true;
            else
                visited[i] = false;

            if (cal == 0)
                return false;
        }

        return false;
    }
}

Решение этого вопроса относится к мысли этого большого парня
Ссылка: https://leetcode.cn/problems/partition-to-k-equal-sum-subsets/solution/by-ac_oier-mryw/

Supongo que te gusta

Origin blog.csdn.net/weixin_45800258/article/details/126983425
Recomendado
Clasificación