算法设计与分析典例总结
public class BubbleSort {
public static void swap ( int [ ] keys, int i, int j) {
int temp= keys[ j] ;
keys[ j] = keys[ i] ;
keys[ i] = temp;
}
public static void bubbleSort ( int [ ] keys) {
boolean exchange= true ;
for ( int i= 0 ; i< keys. length- 1 ; i++ ) {
exchange= false ;
for ( int j= 0 ; j< keys. length- 1 - i; j++ ) {
if ( keys[ j] > keys[ j+ 1 ] ) {
swap ( keys, j, j+ 1 ) ;
exchange= true ;
}
}
}
}
}
public class InsertSort {
public static void insertSort ( int [ ] keys) {
for ( int i= 1 ; i< keys. length; i++ ) {
int temp= keys[ i] ;
int flag= i;
int j= i;
while ( j> 0 && temp< keys[ j- 1 ] ) {
keys[ j] = keys[ j- 1 ] ;
flag= j;
j-- ;
}
keys[ j] = temp;
}
}
public static void main ( String [ ] args) {
int [ ] testNum= { 32 , 26 , 87 , 72 , 22 } ;
insertSort ( testNum) ;
for ( int i= 0 ; i< testNum. length; i++ ) {
System . out. println ( testNum[ i] ) ;
}
}
}
public class MergeSort {
public static void merge ( int [ ] keys, int begin, int midNum, int end) {
int j, k, h;
j= begin;
h= midNum+ 1 ;
k= begin;
int a[ ] = new int [ keys. length] ;
while ( j<= midNum && h<= end) {
if ( keys[ j] < keys[ h] ) {
a[ k++ ] = keys[ j++ ] ;
}
else {
a[ k++ ] = keys[ h++ ] ;
}
}
while ( j<= midNum) {
a[ k++ ] = keys[ j++ ] ;
}
while ( h<= end) {
a[ k++ ] = keys[ h++ ] ;
}
for ( k= begin; k<= end; k++ ) {
keys[ k] = a[ k] ;
}
}
public static void mergeSort ( int [ ] keys, int begin, int end) {
if ( begin< end) {
int midNum = ( end+ begin) / 2 ;
mergeSort ( keys, begin, midNum) ;
mergeSort ( keys, midNum + 1 , end) ;
merge ( keys, begin, midNum, end) ;
}
}
public static void main ( String [ ] args) {
int [ ] testNum= { 26 , 32 , 22 , 87 } ;
merge ( testNum, 0 , 1 , 3 ) ;
for ( int i= 0 ; i< testNum. length; i++ ) {
System . out. println ( testNum[ i] ) ;
}
System . out. println ( "*******************" ) ;
int [ ] test= { 32 , 26 , 87 , 73 , 66 , 55 , 99 , 75 , 74 } ;
mergeSort ( test, 0 , 8 ) ;
for ( int i= 0 ; i< test. length; i++ ) {
System . out. println ( test[ i] ) ;
}
}
}
public class QuickSort {
public static int Partition ( int [ ] keys, int begin, int end) {
int i= begin;
int j= end;
int accordingNum= keys[ begin] ;
while ( i< j) {
while ( keys[ j] <= accordingNum && i< j) {
j-- ;
}
while ( keys[ i] >= accordingNum && i< j) {
i++ ;
}
if ( i< j) {
swap ( keys, i, j) ;
i++ ;
j-- ;
}
}
return j;
}
public static void swap ( int [ ] keys, int x, int y) {
int temp= keys[ x] ;
keys[ x] = keys[ y] ;
keys[ y] = temp;
}
public static void quickSort ( int [ ] keys, int begin, int end) {
if ( begin< end) {
int flag= Partition ( keys, begin, end) ;
swap ( keys, begin, flag) ;
quickSort ( keys, begin, flag- 1 ) ;
quickSort ( keys, flag+ 1 , end) ;
}
}
public static void main ( String [ ] args) {
int [ ] testList= { 27 , 7 , 98 , 3 , 96 , 95 } ;
quickSort ( testList, 0 , 5 ) ;
for ( int i= 0 ; i< testList. length; i++ ) {
System . out. println ( testList[ i] ) ;
}
}
}
public class SelectSort {
public static void swap ( int [ ] keys, int i, int j) {
int temp= keys[ j] ;
keys[ j] = keys[ i] ;
keys[ i] = temp;
}
public static void selectSort ( int [ ] keys) {
for ( int i= 0 ; i< keys. length- 1 ; i++ ) {
int flag= i;
for ( int j= i+ 1 ; j< keys. length; j++ ) {
if ( keys[ j] < keys[ i] ) {
flag= j;
}
}
swap ( keys, i, flag) ;
}
}
public static void main ( String [ ] args) {
int [ ] testNum= { 32 , 26 , 87 , 72 , 17 } ;
selectSort ( testNum) ;
for ( int i= 0 ; i< testNum. length; i++ ) {
System . out. println ( testNum[ i] ) ;
}
}
}
public class BinarySearch {
public static int binarySearch ( int [ ] keys, int x) {
int i= 0 ;
int j= keys. length- 1 ;
int flag;
while ( i<= j) {
flag= ( i+ j) / 2 ;
if ( keys[ flag] == x) {
return flag;
}
else if ( keys[ flag] > x) {
j= flag- 1 ;
}
else {
i= flag+ 1 ;
}
}
return 0 ;
}
public static int binarySearch2 ( int [ ] keys, int x) {
return binarySearch3 ( keys, x, 0 , keys. length- 1 ) ;
}
public static int binarySearch3 ( int [ ] keys, int x, int begin, int end) {
int i= begin;
int j= end;
int flag= ( begin+ end) / 2 ;
if ( i<= j) {
if ( x== keys[ flag] ) {
return flag;
}
else if ( x> keys[ flag] ) {
return binarySearch3 ( keys, x, flag+ 1 , end) ;
}
else {
return binarySearch3 ( keys, x, begin, flag- 1 ) ;
}
}
return 0 ;
}
public static void main ( String [ ] args) {
int [ ] testList= { 1 , 2 , 3 , 4 , 5 } ;
int result;
result= binarySearch2 ( testList, - 1 ) ;
System . out. println ( result) ;
}
}
public class FindSecond {
public static void findSecond ( int [ ] keys) {
int length= keys. length;
int compareListLength= length* 2 ;
int [ ] compareList= new int [ compareListLength] ;
int max;
int second= - 1 ;
for ( int i= length; i< compareListLength; i++ ) {
compareList[ i] = keys[ i- length] ;
}
for ( int i= compareListLength- 2 ; i>= 2 ; i= i- 2 ) {
compareList[ i/ 2 ] = Math . max ( compareList[ i] , compareList[ i+ 1 ] ) ;
}
max= compareList[ 1 ] ;
for ( int i= 1 ; 2 * i< compareListLength; ) {
if ( compareList[ 2 * i] == compareList[ i] ) {
if ( second< compareList[ 2 * i+ 1 ] ) {
second= compareList[ 2 * i+ 1 ] ;
}
i= 2 * i;
}
else {
if ( second< compareList[ 2 * i] ) {
second= compareList[ 2 * i] ;
}
i= 2 * i+ 1 ;
}
}
System . out. println ( "max:" + max) ;
System . out. println ( "second:" + second) ;
}
public static void main ( String [ ] args) {
int [ ] testList= { 5 , 3 , 1 , 2 , 4 } ;
findSecond ( testList) ;
}
}
public class BestBinarySearchTree {
public static double bestBinarySearchTree ( int [ ] s, double [ ] p, double [ ] [ ] m, int [ ] [ ] k) {
int s_length= s. length- 1 ;
int p_length= p. length- 1 ;
for ( int i= 1 ; i<= s_length; i++ ) {
m[ i] [ i- 1 ] = 0 ;
k[ i] [ i- 1 ] = 0 ;
}
for ( int i= 1 ; i<= s_length; i++ ) {
m[ i] [ i] = p[ 2 * i- 1 ] + p[ 2 * i] + p[ 2 * i+ 1 ] ;
k[ i] [ i] = i;
}
int l= 0 ;
double min= 0 ;
for ( int i= 2 ; i<= s_length; i++ ) {
for ( int j= 1 ; j<= s_length- i+ 1 ; j++ ) {
l= j+ i- 1 ;
double w= calculateW ( j, l, p) ;
m[ j] [ l] = m[ j] [ j- 1 ] + m[ j+ 1 ] [ l] + w;
k[ j] [ l] = 0 ;
for ( int o= j+ 1 ; o<= l- 1 ; o++ ) {
double result= m[ j] [ o- 1 ] + m[ o+ 1 ] [ l] + w;
if ( result< m[ j] [ l] ) {
min= result;
m[ j] [ l] = result;
k[ j] [ l] = o;
}
}
}
}
return min;
}
public static double calculateW ( int begin, int end, double [ ] p) {
double w;
w= p[ 2 * begin- 1 ] + p[ 2 * begin] + p[ 2 * begin+ 1 ] ;
for ( int i= begin+ 1 ; i<= end; i++ ) {
w += p[ 2 * i] + p[ 2 * i+ 1 ] ;
}
return w;
}
public static void main ( String [ ] args) {
int [ ] s= { 0 , 1 , 2 , 3 , 4 , 5 } ;
double [ ] p= { 0 , 0.04 , 0.1 , 0.02 , 0.3 , 0.02 , 0.1 , 0.05 , 0.2 , 0.06 , 0.1 , 0.01 } ;
double [ ] [ ] m= new double [ s. length] [ s. length] ;
int [ ] [ ] k= new int [ s. length] [ s. length] ;
double result= bestBinarySearchTree ( s, p, m, k) ;
System . out. println ( result) ;
for ( int i= 1 ; i< s. length; i++ ) {
for ( int j= 1 ; j< s. length; j++ ) {
System . out. print ( m[ i] [ j] + " " ) ;
}
System . out. println ( ) ;
}
System . out. println ( "******************************" ) ;
for ( int i= 1 ; i< k. length; i++ ) {
for ( int j= 1 ; j< k. length; j++ ) {
System . out. print ( k[ i] [ j] + " " ) ;
}
System . out. println ( ) ;
}
}
}
public class KnapsackProblem {
public static void completePack ( int n, int b, int [ ] weight, int [ ] value, int [ ] [ ] dp, int [ ] [ ] flag) {
for ( int i= 1 ; i<= n; i++ ) {
dp[ i] [ 0 ] = 0 ;
}
for ( int i= 1 ; i<= b; i++ ) {
dp[ 0 ] [ i] = 0 ;
}
for ( int i= 1 ; i<= n; i++ ) {
flag[ i] [ 0 ] = 0 ;
}
for ( int i= 1 ; i<= b; i++ ) {
flag[ 0 ] [ i] = 0 ;
}
for ( int k= 1 ; k<= n; k++ ) {
for ( int y= 1 ; y<= b; y++ ) {
if ( weight[ k] > y) {
dp[ k] [ y] = dp[ k- 1 ] [ y] ;
flag[ k] [ y] = flag[ k- 1 ] [ y] ;
}
else {
if ( dp[ k- 1 ] [ y] > dp[ k] [ y- weight[ k] ] + value[ k] ) {
flag[ k] [ y] = flag[ k- 1 ] [ y] ;
}
else {
flag[ k] [ y] = k;
}
dp[ k] [ y] = Math . max ( dp[ k- 1 ] [ y] , dp[ k] [ y- weight[ k] ] + value[ k] ) ;
}
}
}
}
public static void trackSolution ( int b, int n, int [ ] [ ] flag, int [ ] solution, int [ ] weight) {
for ( int i= 1 ; i<= n; i++ ) {
solution[ i] = 0 ;
}
int y= b;
int j= n;
do {
j= flag[ j] [ y] ;
solution[ j] = 1 ;
y= y- weight[ j] ;
while ( flag[ j] [ y] == j) {
y= y- weight[ j] ;
solution[ j] = solution[ j] + 1 ;
}
} while ( flag[ j] [ y] != 0 ) ;
}
public static void main ( String [ ] args) {
int [ ] value= { 0 , 1 , 3 , 5 , 9 } ;
int [ ] weight= { 0 , 2 , 3 , 4 , 7 } ;
int b= 10 ;
int value_length= value. length;
int weight_length= b;
int [ ] [ ] dp= new int [ value_length] [ weight_length+ 1 ] ;
int [ ] [ ] flag= new int [ value_length] [ weight_length+ 1 ] ;
completePack ( value_length- 1 , b, weight, value, dp, flag) ;
System . out. println ( dp[ value_length- 1 ] [ weight_length] ) ;
for ( int i= 1 ; i< value_length; i++ ) {
for ( int j= 1 ; j<= b; j++ ) {
System . out. print ( flag[ i] [ j] + " " ) ;
}
System . out. println ( ) ;
}
int [ ] solution= new int [ value_length] ;
trackSolution ( b, value_length- 1 , flag, solution, weight) ;
for ( int i= 1 ; i< value_length; i++ ) {
System . out. println ( solution[ i] ) ;
}
}
}
public class LCS {
public static void lcs ( int [ ] x, int [ ] y, int [ ] [ ] c, int [ ] [ ] flag) {
int x_length= x. length;
int y_length= y. length;
for ( int i= 1 ; i< x_length; i++ ) {
c[ i] [ 0 ] = 0 ;
}
for ( int i= 1 ; i< y_length; i++ ) {
c[ 0 ] [ i] = 0 ;
}
for ( int i= 1 ; i< x_length; i++ ) {
for ( int j= 1 ; j< y_length; j++ ) {
if ( x[ i] == y[ j] ) {
c[ i] [ j] = c[ i- 1 ] [ j- 1 ] + 1 ;
flag[ i] [ j] = 0 ;
}
else {
if ( c[ i- 1 ] [ j] >= c[ i] [ j- 1 ] ) {
c[ i] [ j] = c[ i- 1 ] [ j] ;
flag[ i] [ j] = 2 ;
}
else {
c[ i] [ j] = c[ i] [ j- 1 ] ;
flag[ i] [ j] = 1 ;
}
}
}
}
}
public static void structureSequence ( int [ ] [ ] flag, int i, int j, int [ ] x, int [ ] result) {
if ( i== 0 || j== 0 )
return ;
if ( flag[ i] [ j] == 0 ) {
result[ i] = x[ i] ;
structureSequence ( flag, i- 1 , j- 1 , x, result) ;
}
else if ( flag[ i] [ j] == 1 ) {
structureSequence ( flag, i, j- 1 , x, result) ;
}
else {
structureSequence ( flag, i- 1 , j, x, result) ;
}
}
public static void main ( String [ ] args) {
int [ ] x= { 0 , 1 , 2 , 3 , 2 , 4 , 1 , 2 } ;
int [ ] y= { 0 , 2 , 4 , 3 , 1 , 2 , 1 } ;
int x_length= x. length;
int y_length= y. length;
int [ ] [ ] c= new int [ x_length] [ y_length] ;
int [ ] [ ] flag= new int [ x_length] [ y_length] ;
lcs ( x, y, c, flag) ;
System . out. println ( c[ x_length- 1 ] [ y_length- 1 ] ) ;
int [ ] result= new int [ x_length] ;
structureSequence ( flag, x_length- 1 , y_length- 1 , x, result) ;
for ( int i= 0 ; i< x_length; i++ ) {
System . out. println ( result[ i] ) ;
}
}
}
public class MatrixChain {
public static int matrixChain ( int [ ] keys, int [ ] [ ] m, int [ ] [ ] s) {
int keys_length= keys. length- 1 ;
for ( int i= 1 ; i< keys_length; i++ ) {
m[ i] [ i] = 0 ;
}
for ( int i= 1 ; i< keys_length- 1 ; i++ ) {
s[ i] [ i+ 1 ] = i;
}
int k= 0 ;
int min= 0 ;
for ( int i= 2 ; i<= keys_length; i++ ) {
for ( int j= 1 ; j< keys_length- i+ 1 ; j++ ) {
k= j+ i- 1 ;
m[ j] [ k] = m[ j+ 1 ] [ k] + keys[ j] * keys[ j+ 1 ] * keys[ k+ 1 ] ;
s[ j] [ k] = j;
for ( int t= j+ 1 ; t<= k- 1 ; t++ ) {
int result= m[ j] [ t] + m[ t+ 1 ] [ k] + keys[ j] * keys[ t+ 1 ] * keys[ k+ 1 ] ;
if ( result< m[ j] [ k] ) {
min= result;
m[ j] [ k] = result;
s[ j] [ k] = t;
}
}
}
}
return min;
}
public static void main ( String [ ] args) {
int [ ] keys= { 0 , 30 , 35 , 15 , 5 , 10 , 20 } ;
int length= keys. length- 1 ;
int [ ] [ ] m= new int [ length] [ length] ;
int [ ] [ ] s= new int [ length] [ length] ;
int min= matrixChain ( keys, m, s) ;
System . out. println ( min) ;
for ( int i= 1 ; i< 6 ; i++ ) {
for ( int j= 1 ; j< 6 ; j++ ) {
System . out. print ( m[ i] [ j] + " " ) ;
}
System . out. println ( ) ;
}
}
}
public class MaxSum {
public static int maxSubSum ( int [ ] a, int left, int right) {
if ( left== right) {
return a[ left] ;
}
int center= ( left+ right) / 2 ;
int leftSum;
int rightSum;
leftSum= maxSubSum ( a, left, center) ;
rightSum= maxSubSum ( a, center+ 1 , right) ;
int s1= 0 ;
int s2= 0 ;
int lefts= 0 ;
int rights= 0 ;
for ( int i= center; i>= left; i-- ) {
lefts += a[ i] ;
if ( lefts> s1) {
s1= lefts;
}
}
for ( int i= center+ 1 ; i<= right; i++ ) {
rights += a[ i] ;
if ( rights> s2) {
s2= rights;
}
}
int sum= s1+ s2;
if ( leftSum> sum) {
sum= leftSum;
}
if ( rightSum> sum) {
sum= rightSum;
}
return sum;
}
public static int maxSum ( int [ ] a, int [ ] c, int n) {
int a_length= n;
c[ 0 ] = a[ 0 ] ;
for ( int i= 1 ; i< a_length; i++ ) {
if ( c[ i- 1 ] + a[ i] >= a[ i] ) {
c[ i] = c[ i- 1 ] + a[ i] ;
}
else {
c[ i] = a[ i] ;
}
}
int max= 0 ;
int c_length= c. length;
for ( int i= 0 ; i< c_length; i++ ) {
if ( c[ i] > max) {
max= c[ i] ;
}
}
return max;
}
public static void main ( String [ ] args) {
int [ ] test= { - 2 , 11 , - 4 , 13 , - 5 , - 2 } ;
int result= maxSubSum ( test, 0 , 5 ) ;
System . out. println ( result) ;
int [ ] c= new int [ test. length] ;
int result2= maxSum ( test, c, test. length) ;
System . out. println ( result2) ;
}
}
public class Dijkstra {
private static final int MAX= 100001 ;
public static int [ ] dijkstra1 ( int [ ] [ ] w, int start) {
int length= w. length;
int [ ] shortPath= new int [ length] ;
String path[ ] = new String [ length] ;
for ( int i= 0 ; i< length; i++ ) {
path[ i] = start+ "->" + i;
}
int visited[ ] = new int [ length] ;
visited[ 0 ] = 1 ;
for ( int count= 1 ; count< length; count++ ) {
int k= - 1 ;
int d_min= Integer . MAX_VALUE;
for ( int i= 0 ; i< length; i++ ) {
if ( visited[ i] == 0 && w[ start] [ i] < d_min) {
d_min= w[ start] [ i] ;
k= i;
}
}
shortPath[ k] = d_min;
visited[ k] = 1 ;
for ( int i= 0 ; i< length; i++ ) {
if ( visited[ i] == 0 && w[ start] [ k] + w[ k] [ i] < w[ start] [ i] ) {
w[ start] [ i] = w[ start] [ k] + w[ k] [ i] ;
path[ i] = path[ k] + "->" + i;
}
}
}
for ( int i= 0 ; i< length; i++ ) {
System . out. println ( "从" + start + "出发到" + i + "的最短路径为:" + path[ i] + "=" + shortPath[ i] ) ;
}
return shortPath;
}
public static void dijkstra2 ( int [ ] [ ] w, int start) {
int length= w. length;
int [ ] visited= new int [ length] ;
int [ ] dist= new int [ length] ;
String [ ] path= new String [ length] ;
visited[ 0 ] = 1 ;
dist[ 0 ] = 0 ;
for ( int i= 1 ; i< length; i++ ) {
dist[ i] = w[ start] [ i] ;
}
for ( int i= 0 ; i< length; i++ ) {
path[ i] = start+ "->" + i;
}
for ( int i= 1 ; i< length; i++ ) {
int k= - 1 ;
int d_min= Integer . MAX_VALUE;
for ( int j= 0 ; j< length; j++ ) {
if ( visited[ j] == 0 && dist[ j] < d_min) {
d_min= dist[ j] ;
k= j;
}
}
visited[ k] = 1 ;
for ( int j= 0 ; j< length; j++ ) {
if ( visited[ j] == 0 && dist[ k] + w[ k] [ j] < dist[ j] ) {
dist[ j] = dist[ k] + w[ k] [ j] ;
path[ j] = path[ k] + "->" + j;
}
}
}
for ( int i= 0 ; i< length; i++ ) {
System . out. println ( "从" + start + "出发到" + i + "的最短路径为:" + path[ i] + "=" + dist[ i] ) ;
}
}
public static void main ( String [ ] args) {
int [ ] [ ] weight = {
{ 0 , 10 , MAX, MAX, MAX, 3 } ,
{ MAX, 0 , 7 , 5 , MAX, MAX} ,
{ MAX, MAX, 0 , MAX, MAX, MAX} ,
{ 3 , MAX, 4 , 0 , 7 , MAX} ,
{ MAX, MAX, MAX, MAX, 0 , MAX} ,
{ MAX, 2 , MAX, 6 , 1 , 0 } ,
} ;
int start = 0 ;
dijkstra2 ( weight, start) ;
System . out. println ( "*****************" ) ;
dijkstra1 ( weight, start) ;
}
}
class HufTreeNode implements Comparable < HufTreeNode > {
private char value;
private int data;
private HufTreeNode left;
private HufTreeNode right;
public HufTreeNode ( char value, int data, HufTreeNode left, HufTreeNode right) {
this . value= value;
this . data= data;
this . left= left;
this . right= right;
}
public char getValue ( ) {
return value;
}
public void setValue ( char value) {
this . value = value;
}
public int getData ( ) {
return data;
}
public void setData ( int data) {
this . data = data;
}
public HufTreeNode getLeft ( ) {
return left;
}
public void setLeft ( HufTreeNode left) {
this . left = left;
}
public HufTreeNode getRight ( ) {
return right;
}
public void setRight ( HufTreeNode right) {
this . right = right;
}
@Override
public int compareTo ( HufTreeNode o) {
return this . getData ( ) - o. getData ( ) ;
}
}
public class Huffman {
public static void huffman ( HashMap < Character , Integer > map) {
PriorityQueue < HufTreeNode > queue= new PriorityQueue < > ( ) ;
for ( Map. Entry < Character , Integer > entry : map. entrySet ( ) ) {
HufTreeNode node= new HufTreeNode ( entry. getKey ( ) , entry. getValue ( ) , null , null ) ;
queue. add ( node) ;
}
while ( queue. size ( ) > 1 ) {
HufTreeNode x= queue. poll ( ) ;
HufTreeNode y= queue. poll ( ) ;
HufTreeNode z= new HufTreeNode ( 'z' , x. getData ( ) + y. getData ( ) , x, y) ;
queue. add ( z) ;
}
HufTreeNode root= queue. poll ( ) ;
String huffCode= "" ;
printHuffCode ( root, huffCode) ;
}
public static void printHuffCode ( HufTreeNode root, String huffCode) {
if ( root. getLeft ( ) == null || root. getRight ( ) == null ) {
System . out. println ( "值为" + root. getValue ( ) + ",权值为" + root. getData ( ) + "的二元前缀码为" + huffCode) ;
}
if ( root. getLeft ( ) != null ) {
printHuffCode ( root. getLeft ( ) , huffCode+ '0' ) ;
}
if ( root. getRight ( ) != null ) {
printHuffCode ( root. getRight ( ) , huffCode+ '1' ) ;
}
}
public static void main ( String [ ] args) {
HashMap < Character , Integer > map= new HashMap < > ( ) ;
map. put ( 'a' , 9 ) ;
map. put ( 'b' , 12 ) ;
map. put ( 'c' , 6 ) ;
map. put ( 'd' , 3 ) ;
map. put ( 'e' , 5 ) ;
map. put ( 'f' , 15 ) ;
huffman ( map) ;
}
}
public class MinSpanTree {
private static final int MAX= 1000001 ;
public static void prim ( int [ ] [ ] w, int [ ] near, int n) {
int [ ] s= new int [ n] ;
int [ ] s_v= new int [ n] ;
int [ ] d= new int [ n+ 1 ] ;
s[ 0 ] = 1 ;
for ( int i= 0 ; i< n- 1 ; i++ ) {
s_v[ i] = i+ 2 ;
}
for ( int i= 2 ; i<= n; i++ ) {
near[ i] = 1 ;
}
for ( int i= 2 ; i<= n; i++ ) {
d[ i] = w[ 1 ] [ i] ;
}
for ( int i= 0 ; i< n- 1 ; i++ ) {
int min= MAX;
int result= 2 ;
for ( int j= 2 ; j<= n; j++ ) {
if ( d[ j] < min && d[ j] > 0 ) {
min= d[ j] ;
result= j;
}
}
s[ i+ 1 ] = result;
d[ result] = - 1 ;
for ( int k= 2 ; k<= n; k++ ) {
if ( w[ k] [ result] < d[ k] ) {
d[ k] = w[ k] [ result] ;
near[ k] = result;
}
}
}
for ( int i= 2 ; i<= n; i++ ) {
System . out. println ( i + " ----> " + near[ i] ) ;
}
}
public static void main ( String [ ] args) {
int [ ] [ ] w= new int [ 7 ] [ 7 ] ;
w[ 1 ] [ 2 ] = w[ 2 ] [ 1 ] = 6 ;
w[ 1 ] [ 3 ] = w[ 3 ] [ 1 ] = 1 ;
w[ 1 ] [ 4 ] = w[ 4 ] [ 1 ] = 5 ;
w[ 1 ] [ 5 ] = w[ 5 ] [ 1 ] = MAX;
w[ 1 ] [ 6 ] = w[ 6 ] [ 1 ] = MAX;
w[ 2 ] [ 3 ] = w[ 3 ] [ 2 ] = 5 ;
w[ 2 ] [ 4 ] = w[ 4 ] [ 2 ] = MAX;
w[ 2 ] [ 5 ] = w[ 5 ] [ 2 ] = 3 ;
w[ 2 ] [ 6 ] = w[ 6 ] [ 2 ] = MAX;
w[ 3 ] [ 4 ] = w[ 4 ] [ 3 ] = 5 ;
w[ 3 ] [ 5 ] = w[ 5 ] [ 3 ] = 6 ;
w[ 3 ] [ 6 ] = w[ 6 ] [ 3 ] = 4 ;
w[ 4 ] [ 5 ] = w[ 5 ] [ 4 ] = MAX;
w[ 4 ] [ 6 ] = w[ 6 ] [ 4 ] = 2 ;
w[ 5 ] [ 6 ] = w[ 6 ] [ 5 ] = 6 ;
int [ ] near= new int [ 7 ] ;
prim ( w, near, 6 ) ;
}
}
public class FourQueens {
static int count= 0 ;
private boolean isVaild ( char [ ] [ ] queen, int row, int col) {
for ( int i= row- 1 ; i>= 0 ; i-- ) {
if ( queen[ i] [ col] == 'Q' ) {
return false ;
}
}
for ( int i= row- 1 , j= col+ 1 ; i>= 0 && j< queen[ 0 ] . length; i-- , j++ ) {
if ( queen[ i] [ j] == 'Q' ) {
return false ;
}
}
for ( int i= row- 1 , j= col- 1 ; i>= 0 && j>= 0 ; i-- , j-- ) {
if ( queen[ i] [ j] == 'Q' ) {
return false ;
}
}
return true ;
}
private void printQueen ( char [ ] [ ] queen) {
for ( int i= 0 ; i< queen. length; i++ ) {
for ( int j= 0 ; j< queen. length; j++ ) {
System . out. print ( queen[ i] [ j] ) ;
}
System . out. println ( ) ;
}
}
private void initializeQueen ( char [ ] [ ] queen) {
for ( int i= 0 ; i< queen. length; i++ ) {
for ( int j= 0 ; j< queen. length; j++ ) {
queen[ i] [ j] = 'A' ;
}
}
}
public void queen ( char [ ] [ ] queen, int row) {
if ( row== queen. length) {
count++ ;
printQueen ( queen) ;
System . out. println ( ) ;
return ;
}
for ( int col= 0 ; col< queen. length; col++ ) {
if ( isVaild ( queen, row, col) ) {
queen[ row] [ col] = 'Q' ;
queen ( queen, row+ 1 ) ;
queen[ row] [ col] = 'A' ;
}
}
}
public static void main ( String [ ] args) {
char [ ] [ ] chars= new char [ 4 ] [ 4 ] ;
FourQueens queens= new FourQueens ( ) ;
queens. initializeQueen ( chars) ;
queens. queen ( chars, 0 ) ;
System . out. println ( "总共有" + count + "种放置方法" ) ;
}
}
public class Loading {
public static int [ ] loading ( int [ ] w, int c1) {
int b = c1;
int best = c1;
int i= 0 ;
int n = w. length;
int [ ] x= new int [ n] ;
int [ ] x_flag= new int [ n] ;
while ( true ) {
while ( i < n) {
b -= w[ i] ;
if ( b>= 0 ) {
x[ i] = 1 ;
}
else {
x[ i] = 0 ;
b += w[ i] ;
}
i++ ;
}
i-- ;
if ( b < best) {
best = b;
for ( int count= 0 ; count< n; count++ ) {
x_flag[ count] = x[ count] ;
}
}
int [ ] flag= backTrack ( i, x, b, w) ;
i= flag[ 0 ] ;
b= flag[ 1 ] ;
if ( i== 0 ) {
return x_flag;
}
else {
continue ;
}
}
}
public static int [ ] backTrack ( int i, int [ ] x, int b, int [ ] w) {
int [ ] flag= new int [ 2 ] ;
while ( i> 0 && x[ i] == 0 ) {
i= i- 1 ;
}
if ( x[ i] == 1 ) {
x[ i] = 0 ;
b += w[ i] ;
i= i+ 1 ;
}
flag[ 0 ] = i;
flag[ 1 ] = b;
return flag;
}
public static void main ( String [ ] args) {
int [ ] w= { 90 , 80 , 40 , 30 , 20 , 12 , 10 } ;
int c1= 152 ;
int [ ] x_flag= loading ( w, c1) ;
for ( int i= 0 ; i< 7 ; i++ ) {
System . out. print ( x_flag[ i] + " " ) ;
}
}
}