/*
* 算法思想:
* 使用回溯的方法,每次对index位置的数字进行考虑,如果已经分割成功一组,则1.需要从0开始回溯,2. 将k-1;
* k为截至条件,即还剩几组。
* 已经访问的元素,设置为特殊的值SPE,不用另外分配一个数组进行存储了。
* 等回溯返回后,再将其值修改回来
*
**/
#define SPE INT_MAX
bool rec(int *arr, int len, int index, int target, int target_origin, int k){
int i;
int tmp;
if(k==0) return true;
if(index>=len) return false;
for(i=index; i<len; i++) {
if(arr[i]==SPE || target < arr[i]) continue;
target -= arr[i];
tmp = arr[i];
arr[i] = SPE;
if(target ==0) {
target = target_origin;
if(rec(arr, len, 0, target, target_origin, k-1)) return true;
}else {
if(rec(arr, len, i+1, target, target_origin, k)) return true;
}
arr[i] = tmp;
target += arr[i];
}
return false;
}
bool canPartitionKSubsets(int *arr, int len, int k){
int cnt = 0;
int i=0;
for(i=0; i<len; i++) cnt += arr[i];
if(cnt % k != 0) return false;
return rec(arr, len, 0 , cnt/k, cnt/k, k) ;
}
LeetCode-698-划分为K个相等的子集-C语言
最新推荐文章于 2024-08-25 12:46:18 发布