1、代码
public class XLoading {
static int c;
static int n;
static int [ ] w;
static int cw;
static int bestw;
static int r;
static int [ ] X;
static int [ ] Xbest;
public static void main ( String[ ] args) {
int w[ ] = { 0 , 20 , 30 , 60 , 40 , 40 } ;
int c = 100 ;
int n = w. length - 1 ;
System. out. print ( "货物重量为: " ) ;
for ( int i = 1 ; i <= n; i++ ) {
System. out. print ( w[ i] + " " ) ;
}
System. out. println ( ) ;
System. out. println ( "第一艘船载重量为: " + c) ;
System. out. println ( "第二艘船载重量为: " + c) ;
Initialize ( w, c) ;
int weight2 = 0 ;
for ( int i = 1 ; i <= n; i++ ) {
weight2 += w[ i] * ( 1 - Xbest[ i] ) ;
}
if ( weight2 > c)
System. out. println ( "无解!" ) ;
else {
System. out. println ( "第一艘船的货物载重为: " + bestw) ;
System. out. println ( "第二艘船的货物载重为: " + weight2) ;
for ( int i = 1 ; i <= n; i++ ) {
if ( Xbest[ i] == 1 )
System. out. println ( "第" + i + "件物品装入第一艘船" ) ;
}
for ( int i = 1 ; i <= n; i++ ) {
if ( Xbest[ i] == 0 )
System. out. println ( "第" + i + "件物品载入第二艘船" ) ;
}
}
}
public static int Initialize ( int [ ] weight, int capacity) {
n = weight. length - 1 ;
w = weight;
c = capacity;
bestw = 0 ;
cw = 0 ;
r = 0 ;
X = new int [ n + 1 ] ;
Xbest = new int [ n + 1 ] ;
for ( int i = 1 ; i <= n; i++ ) {
r = r + w[ i] ;
}
Backtrack ( 1 ) ;
return bestw;
}
public static void Backtrack ( int i) {
if ( i > n) {
if ( cw > bestw) {
for ( int j = 1 ; j <= n; j++ )
Xbest[ j] = X[ j] ;
}
bestw = cw;
return ;
}
r = r - w[ i] ;
if ( cw + w[ i] <= c) {
cw = cw + w[ i] ;
X[ i] = 1 ;
Backtrack ( i + 1 ) ;
cw = cw - w[ i] ;
}
if ( cw + r > bestw) {
X[ i] = 0 ;
Backtrack ( i + 1 ) ;
}
r = r + w[ i] ;
}
}
2、结果
3、先r=r-w[i],后r=r+w[i]的原因