Leetcode 698. 划分为k个相等的子集(DAY 44) ---- 动态规划学习期 (今天懒只做一道 研究Bomb Lab)

原题题目

在这里插入图片描述



代码实现(首刷自解超时)

bool visit(int* nums,int numsSize,int pos,int k,int* barrel,int aver)
{
    
    
    if(pos>=numsSize)   return true;
    int i,j;
    for(i=pos;i<numsSize;i++)
    {
    
    
        for(j=0;j<k;j++)
        {
    
    
            if(barrel[j] != aver && barrel[j]+nums[i] <= aver)
            {
    
    
                barrel[j] += nums[i];
                if(visit(nums,numsSize,pos+1,k,barrel,aver))    return true; 
                else    barrel[j] -= nums[i];
            }
        }
        return false;
    }
    return true;
}


bool canPartitionKSubsets(int* nums, int numsSize, int k){
    
    
    int i,j,sum = 0,aver;
    for(i=0;i<numsSize;i++)
        sum += nums[i];
    aver = sum/k;
    if(aver * k != sum)
        return false;
    int barrel[17] = {
    
    0};
    if(nums[0] <= aver)   barrel[0] += nums[0];
    else    return false;
    return visit(nums,numsSize,1,k,barrel,aver);
}


代码实现(首刷自解)

int visited[17];
int end;
int aver;

bool dfs(int* nums, int numsSize, int nowLen, int nowGet, int pos)
{
    
    
    int i;

    if (pos >= numsSize)    return false;
    if (nowGet == end)      return true;

    for (i = pos; i < numsSize; i++)
    {
    
    
        if(visited[i] != 1)
        {
    
    
            if (nowLen + nums[i] == aver)
            {
    
    
                visited[i] = 1;
                if (dfs(nums, numsSize, 0, nowGet + 1, nowGet)) return true;
                visited[i] = 0;
            }
            else if (nowLen + nums[i] < aver)
            {
    
    
                visited[i] = 1;
                if (dfs(nums, numsSize, nowLen + nums[i], nowGet, i + 1))
                    return true;
                visited[i] = 0;
               for (; i + 1 < numsSize && nums[i] == nums[i + 1]; i++);
            }
        }
    }
    return false;
}

bool canPartitionKSubsets(int* nums, int numsSize, int k)
{
    
    
    memset(visited, 0, sizeof(visited));
    end = k;
    aver = 0;
    
    for (int i = 0; i < numsSize; i++)
        aver += nums[i];
    
    aver /= k;

    if (dfs(nums, numsSize, 0, 0, 0))
        return true;
    else
        return false;
}

猜你喜欢

转载自blog.csdn.net/qq_37500516/article/details/113781064