Find_YourHeart 2020-03-15 21:53 采纳率: 0%
浏览 178
已结题

不知道哪里写得不对【698. 划分为k个相等的子集】

求大神指点迷津,这段代码怎么修改,才可以AC.

例如输入: {4, 3, 2, 3, 5, 2, 1}

5

如果不经过排序,是TRUE,经过排序就是FLASE。 提交的时候把qsort去掉后,卡在了用例

[10,10,10,7,7,7,7,7,7,6,6,6]

3

代码如下:

#define true 1
#define false 0
#define bool int
#define N 17
int vis[N] = {0};
int my_cmp(const void* a, const void* b)
{
    int *pa = (int*)a;
    int *pb = (int*)b;
    return *pa - *pb;
}
int dfs(int* nums, int numsSize, int target, int sum, int box)
{
    int i = 0;
    if (box == 0) {
        return true;
    }
    for (i = 0; i < numsSize ; ++i) {
        if (vis[i] == 0 ) {
            vis[i] = 1;
            if (sum + nums[i] == target && (sum + nums[i] <= target)) {
                return dfs(nums, numsSize, target, 0, box - 1);

            }
            else if (dfs(nums, numsSize, target, sum + nums[i], box)) {
                return true;
            }
            vis[i] = 0;
        }
    }
    return false;
}
bool canPartitionKSubsets(int* nums, int numsSize, int k)
{
    int sum = 0;
    int i, target;
    memset(vis, 0, sizeof(vis));
    for (i = 0; i <numsSize; i++) {
        sum += nums[i];
    }
    if (sum % k != 0) {
        return false;
    }
    target = sum / k;
    return dfs(nums, numsSize, target, 0, k);

}
int main()
{
    int nums[]= {4, 3, 2, 3, 5, 2, 1};
    int res = 0;
    int i;
    qsort(nums, sizeof(nums) / sizeof(int), sizeof(int), my_cmp);
    res = canPartitionKSubsets(nums, sizeof(nums) / sizeof(int), 4);
    printf("%d\n",res);
}
  • 写回答

1条回答 默认 最新

  • threenewbee 2020-03-15 23:33
    关注
    
    /*
    * 算法思想:
    * 使用回溯的方法,每次对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) ;
    }
    
    
    评论

报告相同问题?

悬赏问题

  • ¥20 求个正点原子stm32f407开发版的贪吃蛇游戏
  • ¥15 正弦信号发生器串并联电路电阻无法保持同步怎么办
  • ¥15 划分vlan后,链路不通了?
  • ¥20 求各位懂行的人,注册表能不能看到usb使用得具体信息,干了什么,传输了什么数据
  • ¥15 个人网站被恶意大量访问,怎么办
  • ¥15 Vue3 大型图片数据拖动排序
  • ¥15 Centos / PETGEM
  • ¥15 划分vlan后不通了
  • ¥20 用雷电模拟器安装百达屋apk一直闪退
  • ¥15 算能科技20240506咨询(拒绝大模型回答)