[1,1,2,2,2]
可以拼成一個正方形[1+1,2,2,2]
思想:
1.木桶法,把四個邊當作四個木桶,從數組大的一端開始裝入木桶,一直裝到avg
2.回溯,每個數組元素可以裝在木桶裏。也可以不裝在木桶裏讓下一個木桶裝。
bool make_sq(vector<int>& nums,vector<int>& count,int begin,int end,int avg)
{
if(begin==end&&count[0]==avg&&count[1]==avg&&count[2]==avg&&count[3]==avg)
return true;//退出條件
int i;
for(i=0;i<4;i++)//路徑選擇
{
if(count[i]+nums[end]<=avg)//必須有等號,不然沒法進入下一個木桶的循環,這裏是個剪枝
{
count[i]=count[i]+nums[end];//如果當前木桶裝
if(make_sq(nums,count,begin,end-1,l))
return true;
count[i]=count[i]-nums[end];//如果當前木桶不裝
}
}
return false;
}
bool makesquare(vector<int>& nums) {
long long sum=0;
int len=nums.size(),i;
if(len<4)
return false;
for(i=0;i<len;i++)
sum=sum+nums[i];
if(sum%4!=0)
return false;
long long l=sum%4;
sort(nums.begin(),nums.end());
vector<int> count;
for(i=0;i<4;i++)
count.push_back(0);
return make_sq(nums,count,-1,len-1,sum/4);
}