將數組劃分爲k個和相等的子數組 Partition to K Equal Sum Subsets

問題:數組

Given an array of integers nums and a positive integer k, find whether it's possible to divide this array into k non-empty subsets whose sums are all equal.ide

Example 1:函數

Input: nums = [4, 3, 2, 3, 5, 2, 1], k = 4
Output: True
Explanation: It's possible to divide it into 4 subsets (5), (1, 4), (2,3), (2,3) with equal sums.

Note:this

  • 1 <= k <= len(nums) <= 16.
  • 0 < nums[i] < 10000.

解決:.net

①  與Partition Equal Subset Sum相似,那道題只讓分紅兩個子集合,因此問題能夠轉換爲是否存在和爲整個數組和的一半的子集合,能夠用dp來作。可是這道題讓求k個和相同的,感受沒法用dp來作,由於就算找出了一個,其他的也須要驗證。code

dfs,首先咱們仍是求出數組的全部數字之和sum,首先判斷sum是否能整除k,不能整除的話直接返回false。而後須要一個visited數組來記錄哪些數組已經被選中了,而後調用遞歸函數。blog

class Solution { //15ms
    public boolean canPartitionKSubsets(int[] nums, int k) {
        int sum = 0;
        for (int n : nums){
            sum += n;
        }
        if (k <= 0 || sum % k != 0) return false;
        boolean[] isvisiteed = new boolean[nums.length];
        return dfs(nums,k,sum / k,0,0,isvisiteed);
    }
    public boolean dfs(int[] nums,int k,int target,int i,int cursum,boolean[] isvisited){
        if (k == 1) return true;
        if (cursum == target) return dfs(nums,k - 1,target,0,0,isvisited);
        for (int j = i;j < nums.length;j ++){
            if (! isvisited[j] && nums[j] + cursum <= target){
                isvisited[j] = true;
                if (dfs(nums,k,target,j + 1,cursum + nums[j],isvisited)) return true;
                isvisited[j] = false;
            }
        }
        return false;
    }
}遞歸

相關文章
相關標籤/搜索