package bag ; public class Test { public static int getTwoSubArrayMinDiff ( int [ ] array) { int ans = 0 ; if ( array. length == 0 ) return ans; int n = array. length; int SUM = 0 ; for ( int i = 0 ; i < n; i++ ) { SUM += array[ i] ; } int [ ] [ ] dp = new int [ n + 1 ] [ SUM / 2 + 1 ] ; for ( int i = 0 ; i < n; i++ ) { for ( int j = 1 ; j <= SUM / 2 ; j++ ) { dp[ i + 1 ] [ j] = dp[ i] [ j] ; if ( array[ i] <= j && dp[ i] [ j - array[ i] ] + array[ i] > dp[ i] [ j] ) { dp[ i + 1 ] [ j] = dp[ i] [ j - array[ i] ] + array[ i] ; } } } return SUM - 2 * dp[ n] [ SUM / 2 ] ; } public static void main ( String [ ] args) {
int [ ] array = { 25 , 0 , 18 , 3 , 9 , 4 , 12 , 7 , 6 , 11 } ; System . out. println ( getTwoSubArrayMinDiff ( array) ) ; System . out. println ( getTwoSubArrayMinDiff2 ( array) ) ; } public static int getTwoSubArrayMinDiff2 ( int [ ] array) { if ( array. length == 0 ) { return 0 ; } int sum = 0 ; for ( int x : array) { sum += x; } int n = array. length; int [ ] [ ] dp = new int [ n] [ sum / 2 + 1 ] ; for ( int i = 0 ; i <= sum / 2 ; i++ ) { dp[ 0 ] [ i] = ( i >= array[ 0 ] ) ? array[ 0 ] : 0 ; } for ( int i = 1 ; i < n; i++ ) { for ( int j = 0 ; j <= sum / 2 ; j++ ) { dp[ i] [ j] = dp[ i - 1 ] [ j] ; if ( j >= array[ i] ) { dp[ i] [ j] = Math . max ( dp[ i] [ j] , dp[ i - 1 ] [ j - array[ i] ] + array[ i] ) ; } } } return sum - 2 * dp[ n - 1 ] [ sum / 2 ] ; }
}