1237 - Shredding Company
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=1237
問題
数字とtargetが与えられる。
数字を分割してその和がtargetを超えないで最大となる分割の仕方を出力する。
そのような分割の仕方が2つ以上ある時はrejected。
どのように分割してもtargetを超えてしまう時はerror。
解法
数字の桁が6桁以下という事なので分割方法を全探索。
分割の仕方は、数字の間に仕切りを入れる事を考えればbit集合で列挙する事が出来る。
数字は文字列で管理した。
ソース
int main() { int t; string num; while(cin >> t >> num, t||num!="0") { int n = num.size(); vector<string> ansv; int ans = 0; bool reject = 0; REP(S, 1<<(n-1)) { int last = 0; vector<string> v; REP(i, n-1) { if (S>>i & 1) { v.push_back(num.substr(last, i-last+1)); last = i+1; } } v.push_back(num.substr(last)); int sum = 0; FOR(it, v) sum += atoi(it->c_str()); if (sum > ans && sum <= t) { ans = sum; ansv = v; reject = 0; } else if (sum == ans) { reject = 1; } } if (reject) { cout << "rejected" <<endl; } else if (ans == 0) { cout << "error" << endl; } else { cout << ans; FOR(it, ansv) { cout << " " << *it; } cout << endl; } } }