题目:
分析:
看题也太不认真了吧,看完题,还以为是求最大值的最小值。
原来是和的最小值。
相同大小。
那肯定排序后先放都第一个里面,无法放第一个里面的放第二个里面。
大佬题解给的dp,状态压缩。
我还是老老实实的尝试贪心吧!
不对:
剪枝:
虽然超时但我尽力了。剪枝策略在代码中说明了,一共两处:
class Solution {
public:
int minn=1000;
void f(vector<int>& nums,int x,int k,vector<vector<int> > vv)
{//排序数组,该用数组第几个元素了,分组k值,f分组抢矿vv,
if(x==nums.size())
{
int all=0;
for(int i=0;i<k;i++)
{
all+=(vv[i][vv[i].size()-1]-vv[i][0]);
}
minn=min(minn,all);
return;
}
//当前划分的不兼容性如果大于minn了,直接剪枝。
int all=0;
for(int i=0;i<k;i++)
{
if(vv[i].size()!=0)
all+=(vv[i][vv[i].size()-1]-vv[i][0]);
if(all>minn) return;
}
for(int i=0;i<vv.size();i++)
{
int ok=1;
//如果之前放到过相同的vector中,那么就不需要再放入了。
for(int j=0;j<i;j++)
{
if(vv[i]==vv[j])
{
ok=0;
break;
}
}
if(!ok) continue;
if(vv[i].size()==nums.size()/k) continue;
if(vv[i].size()!=0&&nums[x]==vv[i][vv[i].size()-1]) continue;
vv[i].push_back(nums[x]);
f(nums,x+1,k,vv);
vv[i].pop_back();
}
}
int minimumIncompatibility(vector<int>& nums, int k) {
if(k==nums.size())
{
return 0;
}
if(k==1)
{
sort(nums.begin(),nums.end());
for(int i=1;i<nums.size();i++)
{
if(nums[i]==nums[i-1]) return -1;
}
return nums[nums.size()-1]-nums[0];
}
//一般的情况。
sort(nums.begin(),nums.end());
vector<int> v;
vector<vector<int> > vv(k,v);
f(nums,0,k,vv);
if(minn==1000) minn=-1;
return minn;
}
};