AOJ1237 Shredding Company

問題リンク Shredding Company

  • 概要

ターゲットとなる整数tと印字された整数numが与えられる。numを任意の場所でカットし、できた断片に書かれている数字の総和を考えたとき、tを超えずに最大となるものを求め、更にそれを実現するカットを答えよ。
どのようにカットしてもtを超えてしまう場合はerror, 最大となるカット方法が2つ以上ある場合はrejectedと答えよ。
t, numは最大6ケタ

  • 解法

numは6ケタまでしかないのでカットする個所は最大でも5か所です。それぞれについて、カットする,しないを全通り試します。2^5しかないので計算量の心配は何もないです。

  • ソース
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

//Shredding Company
public class AOJ1237 {

	void run(){
		Scanner sc = new Scanner(System.in);
		for(;;){
			int t = sc.nextInt();
			String s = sc.next();
			if(t==0&&"0".equals(s))break;
			int max = -1;
			List<String> piece = new ArrayList<String>();
			boolean col = false;
			int n = s.length()-1;
			for(int i=0;i<1<<n;i++){
				int p = 0;
				int sum = 0;
				List<String> sub = new ArrayList<String>();
				for(int j=0;j<n;j++){
					if((i>>j&1)==0)continue;
					String u = s.substring(p, j+1);
					sub.add(u);
					sum += Integer.parseInt(u);
					p = j+1;
				}
				sub.add(s.substring(p));
				sum += Integer.parseInt(s.substring(p));
				if(sum<=t&&max<sum){
					max = sum; col = false; piece = sub;
				}
				else if(sum==max){
					col = true;
				}
			}
			if(max==-1)System.out.println("error");
			else if(col)System.out.println("rejected");
			else{
				System.out.print(max+" ");
				for(int i=0;i<piece.size();i++)System.out.print(piece.get(i)+(i==piece.size()-1?"\n":" "));
			}
		}
	}
	
	public static void main(String[] args) {
		new AOJ1237().run();
	}
}