一、动态规划
1.最长公共子序列
public int[][] lcsLength(Object[] x,Object[] y){
int m = x.length;
int n = y.length;
int[][] c = new int[m+1][n+1];
for(int i=1;i<=m;i++){
c[i][0] = 0;
}
for(int j=0;j<=n;j++){
c[0][j] = 0;
}
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(x[i-1].equals(y[j-1])){
c[i][j] = c[i-1][j-1]+1;
}else if(c[i][j-1]>=c[i-1][j]){
c[i][j] = c[i][j-1];
}else{
c[i][j] = c[i-1][j];
}
}
}
return c;
}
public void prtLcs(int[][] c,Object[] x,Object[] y,int i,int j){
if(i==0 || j==0){
return;
}
if(x[i-1].equals(y[j-1])){
prtLcs(c,x,y,i-1,j-1);
System.out.print(x[i-1]+" ");
}else if(c[i][j-1]>=c[i-1][j]){
prtLcs(c,x,y,i,j-1);
}else{
prtLcs(c,x,y,i-1,j);
}
}
2.0-1背包问题
//w:重量;v:价值;C:最大重量
public int[][] sack(int[] w,int[] v,int C){
int[][] m = new int[w.length+1][C+1];
for(int i=0;i<=w.length;i++){
m[0][i] = 0;
}
for(int i=1;i<=w.length;i++){
m[i][0] = 0;
for(int j=1;j<=C;j++){
if(w[i-1]>j){
m[i][j] = m[i-1][j];
}else if(v[i-1]+m[i-1][j-w[i-1]]>m[i-1][j]){
m[i][j] = v[i-1]+m[i-1][j-w[i-1]];
}else{
m[i][j] = m[i-1][j];
}
}
}
return m;
}
public int[] buildSolution(int[][] m,int[] w,int C){
int[] x = new int[w.length];
int j = C;
for(int i=w.length;i>=1;i--){
if(m[i][j]==m[i-1][j]){
x[i-1] = 0;
}else{
x[i-1] = 1;
j = j - w[i-1];
}
}
return x;
}