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<iostream>
#include<vector>
#include<algorithm>
#include<utility>
#include<string>
#include<cmath>
#include<cstring>
#include<queue>
#include<map>
#include<climits>
#include<set>

#define REP(i, n) for(int i = 0;i < n;i++)
#define REPR(i, n) for(int i = n;i >= 0;i--)
#define FOR(i, m, n) for(int i = m;i < n;i++)
#define FORR(i, m, n) for(int i = m;i >= n;i--)
#define SORT(v, n) sort(v, v+n);
#define VSORT(v) sort(v.begin(), v.end());
#define llong long long
#define pb(a) push_back(a)
using namespace std;
typedef pair<int, int> pii;
typedef long long int ll;
typedef pair<ll,ll> pll;
int dx[4] = {1,0,0,-1};
int dy[4] = {0,1,-1,0};
#define MOD 1000000007
#define ARRAY_MAX 100005

const int INF = 1e9+7;


bool check(int mid,vector<int>& w,int maxi_step){

    int now_step = 1;//現在の段数
    int sum = 0;//本の厚みの和
    for(int i = 0;i < w.size();i++){

        if(w[i] > mid){
            return false;//幅を超えている
        }

        if(sum + w[i] <= mid){
            sum += w[i];
        }else{
            sum = w[i];//次の段の最初の本
            now_step++;
        }
    }
    
    if(now_step <= maxi_step){
        return true;
    }else{
        return false;
    }
}

int solve(int maxi_step,vector<int>& w){//段数、本の厚み

    int ok = 1500000;
    int ng = 0;//(ng,ok]

    while(abs(ok-ng) > 1){
        int middle = (ok+ng)/2;//本棚1段の厚み
        if(check(middle,w,maxi_step)){
            ok = middle;
        }else{
            ng = middle;
        }
    }
    return ok;
}



int main(){

    int m,n;
    while(cin >> m >> n,m|n){

        vector<int> w(n);
        for(int i = 0;i < n;i++){
            cin >> w[i];
        }
        int ans = solve(m,w);
        cout << ans << endl;
        w.shrink_to_fit();
    }

    return 0;
}

C++: #include<iostream>
#include<algorithm>
#include<vector>
#include<cmath>
#include<climits>
using namespace std;



int n,m;
vector<int> cost;
void init(){
  cost.clear();
}

bool input(){
  cin>>m>>n;
  if(n==0&&m==0)return 0;
  for(int i=0;i<n;i++){
    int tmp;
    cin>>tmp;
    cost.push_back(tmp);
  }
  return 1;
}

int rec(int i,int x){
  int res=INT_MAX-1500010;
  if(i==n){
    return 0;
  }
  if(x==m){
    return res;
  }
  int c=cost[i];
  for(int j=i+1;j<cost.size()+1;j++){
    res=min(res,max(rec(j,x+1),c));
    c+=cost[j];
  }
  return res;
}


int solve(){
  int res=INT_MAX-1500010;
  res=min(res,rec(0,0));
  return res;
}


int main(){
  while(init(),input()){
    cout<<solve()<<endl;
  }
}

C++: #include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <functional>
#include <numeric>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include <utility>
#include <sstream>
#include <complex>

using namespace std;

#define FOR(i,a,b) for(long long i=(a);i<(b);i++)
#define REP(i,N) for(long long i=0;i<(N);i++)
#define ALL(s) (s).begin(),(s).end()
#define fi first
#define se second

#define PI acos(-1.0)
#define INF 1000000007
#define EPS 1e-10
#define MAX_N 20000
#define MAX_M 16

typedef long long ll;
typedef pair<ll, ll> P;
typedef pair<double, double> PD;
typedef pair<string, ll> PS;
typedef vector<ll> V;
typedef pair<P, char> PC;

ll  n, m, b[1000];

int main(){
	while (cin >> m >> n&&n + m){
		//ll MAX = -1;
		REP(i, n){
			cin >> b[i];
			//MAX = max(MAX, b[i]);
		}
		//if (m >= n){
		//	cout << MAX << endl;
		//	continue;
		//}
		ll lb = 0, ub = 1500000;
		while (ub - lb > 1){
			cout << lb << " " << ub << endl;
			int co = 1;
			ll mid = (lb + ub) / 2;
			ll sum = 0;
			bool f = 0;
			REP(i, n){
				if (b[i] > mid){
					f = 1;
					break;
				}
				sum += b[i];
				if (sum > mid){
					sum = b[i];
					co++;
				}
			}
			if (f){
				lb = mid;
				continue;
			}
			if (co <= m)ub = mid;
			else lb = mid;
		}
		cout << ub << endl;
	}
}

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

int main() {
  for(int m, n; cin >> m >> n && (m|n);) {
    vector<int> a(n);
    for(int i = 0; i < n; ++i) {
      cin >> a[i];
    }
    int l = *min_element(a.begin(), a.end()) , r = 1500001;
    while(r-l > 1) {
      int mid = (l+r)/2;
      int x = 0, y = 1;
      for(int i = 0; i < n; ++i) {
        if(x + a[i] > mid) {
          x = a[i];
          ++y;
        } else {
          x += a[i];
        }
      }
      if(y <= m) {
        r = mid;
      } else {
        l = mid+1;
      }
    }
    cout << l << endl;
  }
  return 0;
}