原题题目
代码实现(首刷自解超时)
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;
}