#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
//https://lx.lanqiao.cn/problem.page?gpid=T2982
int an[25],a,b;
int mu[25];
int bo[25];
int c=0;
ll mx=10000000000;
void dfs(int x)
{
if(x==a+1)
{
for(int i=1;i<=b;i++)
{
if(mu[i]==0) return;//有0就代表分得不对
}
int ma=0;
int mi=mu[1];
for(int i=1;i<=b;i++)
{
if(ma<mu[i]) ma=mu[i];
if(mi>mu[i]) mi=mu[i];
}
if(mx>ma-mi) mx=ma-mi;
}
else
{//之前的dfs都是一个循环,而这个是两个
for(int i=x;i<=a;i++)//这个是代表第几个木棍
{
for(int j=1;j<=b;j++)//第二个是对应i根木棍应该放在哪个组里,共b个组
{
if(bo[i]==0)
{
mu[j]+=an[i];
bo[i]=1;
dfs(x+1);
mu[j]-=an[i];//以下两步还原现场
bo[i]=0;
}
}
}
}
}
int main() {
cin.tie(0);
ios::sync_with_stdio(0);
cout.tie(0);
cin>>a>>b;
for(int i=1;i<=a;i++)
cin>>an[i];
dfs(1);
cout<<mx<<endl;
}
/*泛舟沧海,立马昆仑*/
/*若你为了错过太阳而哭泣,那么你也将错过群星了*/
/*红了樱桃,绿了芭蕉*/
粘木棍--dfs
最新推荐文章于 2025-05-21 12:04:25 发布