698[Medium]: Partition to K Equal Sum Subsets

本文探讨了一道关于将数组等分为多个子集的问题,并提供了一种解决方案。输入为一整数数组与目标子集数量,目标是判断是否能将数组等分为指定数量的子集,且各子集之和相等。文章通过示例说明了问题背景,并分享了一个基于回溯搜索的解题思路及代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Part1:题目描述

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.

    Part2:解题思路

      这一题我觉得对我来说还是挺难的,借鉴了leetcode上面的解法才得以解决,要再更深入的理解才行

    Part3:代码

    class Solution {
    public:
        bool search(vector<int>groups, int row, vector<int>& nums, int target) {
    	
    	if (row < 0) return true;
    	// 执行完这一句之后row的值才会变 
    	int v = nums[row--];
    	for (int i = 0; i < groups.size(); i++) {
    		if (groups[i] + v <= target) {
    			groups[i] += v;
    			if (search(groups, row, nums, target)) return true;
    			groups[i] -= v;
    		}
    		if (groups[i] == 0) break;
    	}
    	return false;
    }
    
    bool canPartitionKSubsets(vector<int>& nums, int k) {
    	int length = nums.size();
    	int sum = 0;
    	for (int i = 0; i < length; i++) {
    		sum += nums[i];
    	}
    	if ((sum % k) != 0) return false;
    	int target = sum / k;
    	sort(nums.begin(), nums.end());
    	
    	
    	
    	int row = length - 1;
    	if(nums[row] > target) return false;
    	while (row >= 0 && nums[row] == target) {
    		row--;
    		k--;
    	} 
    	return search(vector<int>(k), row, nums, target);
    }
    };
    


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值