給定乙個整數陣列 nums 和乙個正整數 k,找出是否有可能把這個陣列分成 k 個非空子集,其總和都相等。
示例 1:
輸入: nums = [4, 3, 2, 3, 5, 2, 1], k = 4
輸出: true
說明: 有可能將其分成 4 個子集(5),(1,4),(2,3),(2,3)等於總和。
思路:1.計算出每個子集的和,為 sum = sum(nums) / k
2.將nums公升序排序,如果最大值大於每個子集的和,返回false
3.定義大小為k的陣列arr,相當於k個桶,每個桶的初始值為sum
4.從nums最後乙個數開始遞迴,遞迴函式將每乙個數加入到合適的桶裡面去
什麼時候這個數加入這個桶呢? 當arr[i] == nums[i] || (cur >0 && arr[i] - nums[cur] >= nums[0])
即這個桶正好能放這個數,或者這個桶放完這個數之後至少還能放最小的數
放完之後桶的容量要減少,然後遞迴放下乙個數,如果這個數不能放在這個桶裡面,要從桶裡拿出這個數
#include
#include
#include
#include
using
namespace std;
class
solution
if(sum % k !=0)
sum/
=k;//每個子集之和
sort
(nums.
begin()
,nums.
end())
;if(nums[nums.
size()
-1]> sum)
vector<
int>
arr(k,sum)
;//k個容量為sum的桶
return
foreverynum
(nums,nums.
size()
-1,arr,k);}
bool
foreverynum
(vector<
int>
&nums,
int cur,vector<
int>
&arr,
int k)
//對每個數,遍歷k個桶,選擇乙個放入
for(
int i =
0; i < k; i++
)//這個數不能放在這個桶裡面,從桶中拿回這個數
arr[i]
+= nums[cur];}
}return
false;}
};intmain()
cin>>k;
solution s;
int res = s.
canpartitionksubsets
(nums,k);if
(res ==1)
else
return0;
}
LeetCode 698 劃分為k個相等的子集
給定乙個整數陣列 nums 和乙個正整數 k,找出是否有可能把這個陣列分成 k 個非空子集,其總和都相等。回溯 因為每個元素都要用上,那取到和為target的一組值,就設定total為0重新取。遞迴終止條件是,當沒有值可取且target等於total。一旦找到這樣的集合,提前阻斷,一直返回true ...
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 等於總和。1 k len nums 16 0 nums...
698 劃分為k個相等的子集 python
給定乙個整數陣列 nums 和乙個正整數 k,找出是否有可能把這個陣列分成 k 個非空子集,其總和都相等。示例 1 輸入 nums 4,3,2,3,5,2,1 k 4 輸出 true 說明 有可能將其分成 4 個子集 5 1,4 2,3 2,3 等於總和。注意 1 k len nums 16 0 n...