将数组划分为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.

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:

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

解决:

①  与Partition Equal Subset Sum类似,那道题只让分成两个子集合,所以问题可以转换为是否存在和为整个数组和的一半的子集合,可以用dp来做。但是这道题让求k个和相同的,感觉无法用dp来做,因为就算找出了一个,其余的也需要验证。

dfs,首先我们还是求出数组的所有数字之和sum,首先判断sum是否能整除k,不能整除的话直接返回false。然后需要一个visited数组来记录哪些数组已经被选中了,然后调用递归函数。

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;
    }
}

转载于:https://my.oschina.net/liyurong/blog/1607623

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值