public class First {
int n =5;//n個物品
int[] w = {0,5,4,8,6,9};//物品對應重量
int[] v = {0,20,6,8,15,18};//物品對應的價格
int C = 18;//揹包容量
int[][] maxv = new int[n+1][C+1];
public int test(){
int jMax = (w[n]-1)<C?(w[n]-1):C;
for(int j=0;j<=jMax;j++){
maxv[n][j] = 0;
}
for(int j=jMax + 1;j<=C;j++){
maxv[n][j] = v[n];
}
for(int i=n-1;i>0;i--){
jMax = (w[i]-1)<C?(w[i]-1):C;
for(int j=0;j<=jMax;j++)
maxv[i][j] = maxv[i+1][j];
for(int j=jMax+1;j<=C;j++){
int maxV = maxv[i+1][j]>(v[i]+maxv[i+1][j-w[i]])?maxv[i+1][j]:(v[i]+maxv[i+1][j-w[i]]);
maxv[i][j] = maxV;
}
}
for(int i=0;i<=n;i++){
for(int j=0;j<=C;j++){
System.out.print(maxv[i][j] + " ");
}
System.out.println();
}
return maxv[1][C];
}
int[] x = new int[n+1];
public int[] traceback() {
for(int i=1;i<n;i++){
if(maxv[i][C]==maxv[i+1][C]) {
x[i]=0;
}
else {
x[i]=1;
C-=w[i];
}
x[n]=(maxv[n][C]>0)?1:0;
}
return x;
}
public static void main(String[] args) {
First f = new First();
System.out.println(f.test());
int[] x = f.traceback();
for(int i:x)
System.out.print(i+" ");
}
}
動態規劃求01揹包問題
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.