動態規劃求01揹包問題

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+" ");
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章