http://lintcode.com/en/problem/backpack/

public class Solution {
	    /**
	     * @param m: An integer m denotes the size of a backpack
	     * @param A: Given n items with size A[i]
	     * @return: The maximum size
	     */
	    public int backPack(int m, int[] A) 
	    {
	        // write your code here
	        
	        // d[i][j] means using can use first i items that their sum is j
	        // i= 0 means no items.
	        // d[0][0] = 0.
	        // d[i][j] = d[i - 1][j] || d[i - 1][j - A[i - 1]] // A[i - 1] is the first i item.
	        //
	        // d[j] = d[j - ]
	        
	        int max = 0;
	        
	        boolean d[][] = new boolean[A.length + 1][m + 1];
	        // Iny case, first X items always can sum up to 0: No items used.
	        for (int i = 0 ; i < A.length + 1 ; i ++)
	        {
	            d[i][0] = true;
	        }

            // Iterate	        
	        for (int i = 1 ; i < A.length + 1 ; i ++)
	        {
	            for (int j = 1 ; j < m + 1 ; j ++)
	            {
	                d[i][j] = d[i - 1][j];
	                if (j - A[i - 1] >= 0)
	                {
	                    d[i][j] |= d[i - 1][j - A[i - 1]];
	                }
	                
	                if (d[i][j])
	                {
	                    max = Math.max(max, j);
	                }
	            }
	        }
	        return max;
	    }
}