Problem 1237 : Shredding Company

Problem F: Shredding Company
http://rose.u-aizu.ac.jp/onlinejudge/ProblemSet/description.jsp?id=1237

  • 問題概要

6桁までの数字が書いた紙が与えられる。この紙を好きに分割して、それらの合計の数をつくる。
それが与えられた数にできるだけ近くであり、かつその数字を超えないものをつくれ。
その数字と、どのように分割したか答えよ。

  • 解法

全探索。

  • ソース
#include<iostream>
#include<string>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<sstream>
#include<cassert>
#include<queue>
#include<stack>

#define REP(i,b,n) for(int i=b;i<n;i++)
#define rep(i,n)   REP(i,0,n)
#define ALL(C)     (C).begin(),(C).end()
#define pb         push_back
#define mp         make_pair
#define vint       vector<int>
#define FOR(it,o)  for(__typeof((o).begin()) it=(o).begin(); it!=(o).end(); ++it)
#define lli	    long long int
#define ld	    long double

using namespace std;

string s;
int t, maxi;
bool reject;
vint ans;
void com(int sum, int pos, vint v){
  if(sum > t)return;
  if(pos == s.length()){
    if(maxi == sum){
      reject = true;
    }
    if(maxi < sum){
      reject = false;
      maxi = sum;
      ans = v;
    }
    return;
  }
  int tmp = s.length() - pos;
  rep(i, tmp){
    int tmpi = atoi(s.substr(pos, i+1).c_str());
    vint tmpv = v;
    tmpv.pb(tmpi);
    com(sum + tmpi, pos+i+1, tmpv);
  }
}
    
  


main(){

  while(cin >> t >> s){
    if(t == 0 && s == "0")break;
   
    maxi = -1;
    reject = false;
    
    com(0, 0, vint());
   
    if(reject){
      cout << "rejected" << endl;
    }
    else if(maxi == -1){
      cout << "error" <<endl;
    }
    else {
      cout << maxi;
      FOR(it, ans)cout << ' ' << (*it);
      cout << endl;
    }
  }
}

簡潔にかけた気がする。
substr()の辺で頭がこんがらがった。