信息学奥赛一本通T1442-小木棍 - C语言网 (dotcpp.com)
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;
const int N=1e5+100;
int n;
int res=1e9;
int a[N],p=0,sd=0;
bool vis[N];
bool dfs(int i,int cnt,int spd,int len)
//i:上一个木棍编号,cnt:已经拼好的木棍数,spd:剩余的长度,len:木棍的长度
{if(cnt==p&&spd==0)//木棍全部使用且剩余长度为0return true;else if(cnt==p)//木棍全部使用了但是有剩余的长度return false;else if(spd==0)//木棍还未使用完,但剩余长度已经为0{spd=len;//重置剩余长度i=1;//又从1号开始选}for(int k=i;k<=n;k++){if(vis[k])//已经选了的continue;if(spd-a[k]>=0)//这长度的木棍可选{vis[k]=true;if(dfs(k,cnt+1,spd-a[k],len))return true;vis[k]=false;}}return false;
}
signed main()
{cin>>n;for(int i=1;i<=n;i++){int x;cin>>x;if(x<=50){a[++p]=x;sd+=x;}}sort(a+1,a+n+1,[&](int a,int b){return a>b;});//长度从大到小排序for(int i=a[1];i<=sd;i++){if(sd%i==0)//能被总长度整除的长度才有可能{if(dfs(1,0,i,i)){cout<<i;break;}}}return 0;
}