回溯法暴力枚举
#include<iostream>
using namespace std;
const int maxn=1000000;
int v[maxn],a[maxn],w[maxn];
int m,n;
int counter=0;
int result=0;
int max(int g,int h){
return g>h?g:h; }
int min(int g,int h){
return g<h?g:h; }
int tempmax(int*t,int xx,int yy){
int maxx=0;
for(int p=xx;p<yy;p++)maxx+=t[p];
return maxx;
}
int tempmin(int*t,int xx,int yy){
int maxx=100000;
for(int p=xx;p<yy;p++)if(maxx>t[p])maxx=t[p];
return maxx;
}
void minre(int* b,int cur,int local){
if(cur==m){v[counter++]=result; result=0;return;} else for(int j=0;j<n;j++){
if(local<j){ if(cur==m-1){result=max(result,tempmax(b,local,n));minre(b,cur+1,j);} else{ result=max(result,tempmax(b,local,j));
minre(b,cur+1,j);
} } }
}
int main(){
scanf("%d%d",&m,&n);
for(int i=0;i<n;i++)scanf("%d",&a[i]);
minre(a,0,0);
int re=tempmin(v,0,counter);
printf("%d\n",re);
return 0; }