Go: package main

import (
	"bufio"
	"os"
	"strings"
	"strconv"
	"fmt"
	)

var scanner = bufio.NewScanner(os.Stdin)
const MAX_WIDTH = 1500000

func main() {
	// 二分探索で探す
	// 二分探索はソート済みの配列に対して、特定の条件を満たす値を
	// 効率よく選択するアルゴリズム
	for scanner.Scan() {
		buf := strings.Split(scanner.Text(), " ")
		m, _ := strconv.Atoi(buf[0])
		n, _ := strconv.Atoi(buf[1])
		if n == 0 && m == 0 {
			break
		}
		books := make([]int, n)
		for i := 0; i < n; i++ {
			scanner.Scan()
			books[i], _ = strconv.Atoi(scanner.Text())
		}
		check := func(width int) bool {
			// widthの幅の本棚に順番にbooksを詰めて行ったら
			// 何段になるのかを確認し、それがmを以下であることを確認する
			shelf_index := 1
			position_in_stage := 0
			for i := 0; i < n; i++ {
				// 入れることができない本がある時点でこのwidthは不採用
				if books[i] > width {
					return false
				}
				// 新たに本を追加することができるかをチェックする
				if position_in_stage + books[i] <= width {
					// 新たに本を入れることができたので、そのステージにおける
					// 現在の本の位置を記録
					position_in_stage += books[i]
				} else {
					// 新たな本を入れることができなかったので、一段下のステージに
					// 入れれば良い
					position_in_stage = books[i]
					shelf_index++ // 本棚のステージ数が増えた
				}
			}
			return shelf_index <= m // 条件を満たすかの確認
		}
		low, high := 0, MAX_WIDTH
		for low < high {
			mid := (low+high)/2
			if check(mid) {
				high = mid
			} else {
				low = mid+1
			}
			// log.Printf("low: %d, high: %d\n", low, high)
		}
		fmt.Println(low)
	}
}

C++: #include <bits/stdc++.h>
using namespace std;

int main() {
  int M, N;
  while(cin >> M >> N && M) {
    vector<int> books(N);
    for(int i=0; i<N; i++) {
      cin >> books[i];
    }
    
    int l = 1, r = 1500001;
    while(r - l > 1) {
      int m = (l+r)/2;
      int BPS = 0;
      for(int i=0; i<M; i++) {
	int size = m;
	for(;;) {
	  if(BPS == N) break;
	  if(size - books[BPS] < 0) break;
	  size -= books[BPS++];
	}
	if(BPS == N) break;
      }
      if(BPS == N) {
	r = m;
      } else l = m;
    }
    
    cout << l+1 << endl;
  }
  
  return 0;
}

C++: #include <iostream>
using namespace std;
int main(){
	while(true){
		int m,n,book[101]={},sum[101]={};
		cin >> m >> n;
		if(m==0) break;
		for(int i=1;i<=n;i++){
			cin >> book[i];
			sum[i]=sum[i-1]+book[i];
		}
		int d=0;
		int u=100000;
		int md;
		while(d+1<u){
//			cout << u << " " << d << endl;
			bool ok=false;
			int j=0,until=0;
			md=(d+u)/2;
			for(int i=0;i<m;i++){
				while(sum[j]-sum[until]<=md){
					j++;
					if(j==n+1){
						ok=true;
						break;
					}
				}
				if(ok) break;
				until=j-1;
			}
			if(ok){
				u=md;
				if(d+1>=u){
					cout << u << endl;
					break;
				}
			}
			else{
				d=md;
				if(d+1>=u){
					cout << u << endl;
					break;
				}
			}
		}
	}
	return 0;
}

C++: #define _USE_MATH_DEFINES
#include <iostream>
#include <complex>
#include <algorithm>
#include <vector>
#include <stack>
#include <string>
#include <queue>
#include <cmath>
#include <math.h>
#include <numeric>
#include <list>
#include <sstream>
#include <fstream>
#include <iomanip>
#include <climits>
#include <set>
#include <memory.h>
#include <memory>
#include <cstdio>
#include <cstdlib>
#include <cctype>
#include <cassert>
#include <map>
#include <cassert>
#include <time.h>
#include <ctime>

using namespace std;

typedef complex<double> xy_t;
typedef pair<xy_t, xy_t> line;
typedef long long ll;
typedef pair<int, int> P;
typedef pair<int , P> PP;
typedef pair<int, string> Ps;
typedef vector<int> vec;
typedef vector<vec> mat;
const int INF = 1 << 30;
const double EPS = 1e-9;
const double PI = 3.1415926535897932384626433832795;
const int CLK = CLOCKS_PER_SEC;

#define rep(i, n) for(int i = 0; i < n; i++)
#define rep2(i, m, n) for(int i = m; i < n; i++)

int sum[101];

int main(){
	sum[0] = 0;
	int n, m;
	int l;
	while(cin >> m >> n && (n || m)){
		rep(i, n){
			cin >> l;
			sum[i+1] = sum[i] + l;
		}
		int ub = INF;
		int lb = 0;
		while(ub - lb > 1){
			int mb = (ub + lb) / 2;
			int pos = 0;
			rep(i, m){
				rep2(j, pos+1, n + 1){
					if(sum[j] - sum[pos] > mb){
						pos = j-1;
						break;
					}
					if(j == n) pos = n;
				}
			}
			if(pos == n) ub = mb;
			else lb = mb;
		}
		cout << ub << endl;
	}
	return 0;
}

C++: #include <cstdlib>
#include <cmath>
#include <climits>
#include <cfloat>
#include <map>
#include <utility>
#include <set>
#include <iostream>
#include <memory>
#include <string>
#include <vector>
#include <algorithm>
#include <functional>
#include <sstream>
#include <deque>
#include <complex>
#include <stack>
#include <queue>
#include <cstdio>
#include <cctype>
#include <cstring>
#include <ctime>
#include <iterator>
#include <bitset>
#include <numeric>
#include <list>
#include <iomanip>

#if __cplusplus >= 201103L
#include <array>
#include <tuple>
#include <initializer_list>
#include <unordered_set>
#include <unordered_map>
#include <forward_list>

#define cauto const auto&
#else

#endif

using namespace std;


namespace{
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;

typedef vector<int> vint;
typedef vector<vector<int> > vvint;
typedef vector<long long> vll, vLL;
typedef vector<vector<long long> > vvll, vvLL;

#define VV(T) vector<vector< T > >

template <class T>
void initvv(vector<vector<T> > &v, int a, int b, const T &t = T()){
    v.assign(a, vector<T>(b, t));
}

template <class F, class T>
void convert(const F &f, T &t){
    stringstream ss;
    ss << f;
    ss >> t;
}


#define reep(i,a,b) for(int i=(a);i<(b);++i)
#define rep(i,n) reep((i),0,(n))
#define ALL(v) (v).begin(),(v).end()
#define PB push_back
#define F first
#define S second
#define mkp make_pair
#define RALL(v) (v).rbegin(),(v).rend()


#define MOD 1000000007LL
#define EPS 1e-8
static const int INF=1<<24;
vint v;
int m,n;
bool check(int t){
	// cout<<t<<endl;
	int tmp=0;
	int cnt=1;
	rep(i,n){
		if(v[i]+tmp>t){
			// cout<<tmp<<" ";
			tmp=0;
			cnt++;
			i--;
		}
		else{
			tmp+=v[i];
		}
		if(cnt>m){
			// cout<<"false "<<endl;
			return false;
		}
	}
	// cout<<endl;
	return true;
}


int bs(int l,int r){
	if(l==r) return l;
	int t=(l+r)/2;
	bool f=check(t);
	if(f) return bs(l,t);
	else return bs(t+1,r);
}

void mainmain(){
	while(cin>>m>>n,m||n){
		vint tmp(n);
		rep(i,n){
			cin>>tmp[i];
		}
		v=tmp;
		int ans=bs(1,1500000);
		cout<<ans<<endl;
	}
}



}
main() try{
    mainmain();
}
catch(...){
}

C++: #include<iostream>
#include<vector>
#include<cstdio>

using namespace std;
vector<int> books;

int m, n;

bool judge(int obs)
{
	int sum = 0;
	int cont = 1;
	for(int i = 0; i < books.size(); i++)
	{
		if(books[i] > obs) return false;
		if(sum + books[i] > obs)
		{
			cont++;
			sum = 0;
		}
		sum += books[i];
	}
	return ( (m >= cont)? true : false );
}

int main()
{
	int c;
	while(cin >> m >> n)
	{
		if(m ==0 && n == 0) break;
		for(int i = 0; i < n; i++)
		{
			cin >> c;
			books.push_back(c);
		}
		
		int ub = 1500000, lb = 0;

		while(ub - lb > 1)
		{
			int mid = (ub + lb) / 2;
			if(judge(mid)){
				ub = mid;
			}
			else{
				lb = mid;
			}
		}
		cout << ub << endl;
		books.clear();
	}
}