Problem:
0-1 Knapsack Problem

You have N items that you want to put them into a knapsack. Item i has value vi and weight wi.

You want to find a subset of items to put such that:

The total value of the items is as large as possible.

The items have combined weight at most W, that is capacity of the knapsack.

Find the maximum total value of items in the knapsack.

Input

N W
v1 w1
v2 w2
:
vN wN

The first line consists of the integers N and W. In the following lines, the value and weight of the i-th item are given.

Output

Print the maximum total values of the items in a line.

Constraints

1 ≤ N ≤ 100

1 ≤ vi ≤ 1000

1 ≤ wi ≤ 1000

1 ≤ W ≤ 10000

Sample Input 1

4 5
4 2
5 2
2 1
8 3

Sample Output 1

13

Sample Input 2

2 20
5 9
4 10

Sample Output 2

9

Solution in JAVA (judge verdict: Time Limit Exceeded)


import java.util.Scanner;

/*
 * 着席位置：黒板向かって右から２列目の真ん中
 *
 * https://onlinejudge.u-aizu.ac.jp/#/problems/DPL_1_B
 */

class Main {

	private static int value[];
	private static int weight[];
	private static int maxWeight;

	public static void main(String[] args) throws Exception {
		Scanner scanner = new Scanner(System.in);
		//入力１行目
		value = new int[Integer.parseInt(scanner.next())];
		weight = new int[value.length];
		maxWeight = Integer.parseInt(scanner.next());
		//全品物の入力
		for(int i=0; i<value.length; i++) {
			value[i] = Integer.parseInt(scanner.next());
			weight[i] = Integer.parseInt(scanner.next());
		}
		scanner.close();

		boolean controler[] = new boolean[value.length];

		System.out.println(loopBack(controler));

	}

	private static int loopBack(boolean controler[]) {
		int ret = calSum(controler);
		for(int i=0; i<controler.length; i++) {
			if(controler[i]) continue;//無限に呼び出されるの防止
			//controlerのコピーを作って
			boolean b[] = new boolean[controler.length];
			for(int j=0; j<controler.length; j++) {
				b[j] = controler[j];
			}
			b[i] = true;//i番目だけtrueにして
			int ai = loopBack(b);//もう一周
			if(ai > ret) ret = ai;
		}
		return ret;
	}

	//isPickedのtrueの所だけの合計を計算・ただし容量を越えると-1
	private static int calSum(boolean isPicked[]) {
		int v = 0;
		int w = 0;
		for(int i=0; i<isPicked.length; i++) {
			if(isPicked[i]) {
				v += value[i];
				w += weight[i];
			}
		}
		if(w > maxWeight) v = -1;
		return v;
	}

}