背包问题

01背包

public static void main(String args[]){
        Scanner scan=new Scanner(System.in);
        int n,c;
        n=scan.nextInt();
        c=scan.nextInt();
        int w[]=new int[n];
        int v[]=new int[n];
        int res[]=new int[n];
        for(int i=0;i<n;i++)
            res[i]=0;
        int j=0;
        while(j<n){
            w[j]=scan.nextInt();
            v[j]=scan.nextInt();
            j++;
        }
        int value=knapsack(w,v,res,n,c);
        System.out.println(value);
        for(int i=0;i<n;i++){
            System.out.print(res[i]+" ");
        }
        System.out.println();
    }

    static int knapsack(int w[],int v[],int res[],int n,int c){
        int value=0;
        int f[][]=new int[n][c+1];
        for(int i=0;i<n;i++)
            for(int j=0;j<=c;j++)
                f[i][j]=0;
        for(int j=1;j<=c;j++)
            f[0][j]=(j<w[0])?0:v[0];
        for(int i=1;i<n;i++)
            for(int j=1;j<=c;j++){
               if(j>=w[i]){
                   f[i][j]=(f[i-1][j]>(f[i-1][j-w[i]]+v[i]))?f[i-1][j]:(f[i-1][j-w[i]]+v[i]);
               }else{
                   f[i][j]=f[i-1][j];
               }
            }

        for(int i=0;i<n;i++){
                for(int j=0;j<=c;j++){
                    System.out.print(f[i][j]+" ");
                }
                System.out.println();
        }
        value=f[n-1][c];
        int y=c;
        int x=n-1;
        while(x!=0){
            if(y-w[x]>=0&&f[x][y]==(f[x-1][y-w[x]]+v[x])){
                res[x]=1;
                y=y-w[x];
            }
            x--;
        }
        if(f[0][y]!=0){
            res[0]=1;
        }
        return value;
    }

完全背包

public static void main(String args[]){
        Scanner scan=new Scanner(System.in);
        int n,c;
        n=scan.nextInt();
        c=scan.nextInt();
        int w[]=new int[n];
        int v[]=new int[n];
        int res[]=new int[n];
        for(int i=0;i<n;i++)
            res[i]=0;
        int j=0;
        while(j<n){
            w[j]=scan.nextInt();
            v[j]=scan.nextInt();
            j++;
        }
        int value=knapsack(w,v,res,n,c);
        System.out.println(value);
        for(int i=0;i<n;i++){
            System.out.print(res[i]+" ");
        }
        System.out.println();
    }

    static int knapsack(int w[],int v[],int res[],int n,int c){
        int value=0;
        int f[][]=new int[n][c+1];
        for(int i=0;i<n;i++)
            for(int j=0;j<=c;j++)
                f[i][j]=0;
        for(int j=1;j<=c;j++)
            f[0][j]=(j<w[0])?0:((j/w[0])*v[0]);
        for(int i=1;i<n;i++)
            for(int j=1;j<=c;j++){
                if(j>=w[i]){
                    f[i][j]=(f[i-1][j]>(f[i][j-w[i]]+v[i]))?f[i-1][j]:(f[i][j-w[i]]+v[i]);
                }else{
                    f[i][j]=f[i-1][j];
                }
            }

        for(int i=0;i<n;i++){
            for(int j=0;j<=c;j++){
                System.out.print(f[i][j]+" ");
            }
            System.out.println();
        }
        value=f[n-1][c];
        int y=c;
        int x=n-1;
        while(x!=0){
            while(y-w[x]>=0&&f[x][y]==(f[x][y-w[x]]+v[x])){
                res[x]++;
                y=y-w[x];
            }
            x--;
        }

        res[0]=f[0][y]/v[0];

        return value;
    }

 

 

多重背包

public static void main(String args[]){
        Scanner scan=new Scanner(System.in);
        int n,c;
        n=scan.nextInt();
        c=scan.nextInt();
        int w[]=new int[n];
        int v[]=new int[n];
        int num[]=new int[n];
        int res[]=new int[n];
        for(int i=0;i<n;i++)
            res[i]=0;
        int j=0;
        while(j<n){
            w[j]=scan.nextInt();
            v[j]=scan.nextInt();
            num[j]=scan.nextInt();
            j++;
        }
        int value=knapsack(w,v,num,res,n,c);
        System.out.println(value);
        for(int i=0;i<n;i++){
            System.out.print(res[i]+" ");
        }
        System.out.println();
    }

    static int knapsack(int w[],int v[],int num[],int res[],int n,int c){
        int value=0;
        int f[][]=new int[n][c+1];
        for(int i=0;i<n;i++)
            for(int j=0;j<=c;j++)
                f[i][j]=0;
        for(int j=1;j<=c;j++) {
            int count=Math.min(num[0],j/w[0]);
            f[0][j] = (j < w[0]) ? 0 : (count* v[0]);
        }
        for(int i=1;i<n;i++)
            for(int j=1;j<=c;j++){
               if(j>=w[i]){
                   int count=Math.min(num[i],j/w[i]);
                   f[i][j]=f[i-1][j];
                   for(int k=1;k<=count;k++) {
                      int temp=f[i-1][j-w[i]*k]+k*v[i];
                      if(temp>f[i][j])
                          f[i][j]=temp;
                   }
               }else{
                   f[i][j]=f[i-1][j];
               }
            }

        for(int i=0;i<n;i++){
                for(int j=0;j<=c;j++){
                    System.out.print(f[i][j]+" ");
                }
                System.out.println();
        }
        value=f[n-1][c];
        int y=c;
        int x=n-1;
        while(x!=0){
            int count=Math.min(num[x],y/w[x]);
            for(int k=count;k>0;k--){
                if(f[x][y]==(f[x-1][y-k*w[x]]+k*v[x])){
                    res[x]=k;
                    y=y-k*w[x];
                    break;
                }
            }
            x--;
        }

        res[0]=f[0][y]/v[0];

        return value;
    }

二维费用的多重背包

public static void main(String args[]){
        Scanner scan=new Scanner(System.in);
        int n,c1,c2;
        n=scan.nextInt();
        c1=scan.nextInt();
        c2=scan.nextInt();
        int w1[]=new int[n+1];
        int w2[]=new int[n+1];
        int v[]=new int[n+1];
        int num[]=new int[n+1];
        int res[]=new int[n+1];
        for(int i=0;i<=n;i++)
            res[i]=0;
        int j=1;
        while(j<=n){
            w1[j]=scan.nextInt();
            w2[j]=scan.nextInt();
            v[j]=scan.nextInt();
            num[j]=scan.nextInt();
            j++;
        }
        int value=knapsack(w1,w2,v,num,res,n,c1,c2);
        System.out.println(value);
        for(int i=0;i<=n;i++){
            System.out.print(res[i]+" ");
        }
        System.out.println();
    }

    static int knapsack(int w1[],int w2[],int v[],int num[],int res[],int n,int c1,int c2){
        int value=0;
        int f[][][]=new int[n+1][c1+1][c2+1];
        for(int i=0;i<=n;i++)
            for(int j=0;j<=c1;j++)
                for(int k=0;k<c2;k++)
                f[i][j][k]=0;

        for(int i=1;i<=n;i++)
            for(int j=1;j<=c1;j++)
             for(int k=1;k<=c2;k++)
               if(j>=w1[i]&&k>=w2[i]){
                   int count1=Math.min(num[i],j/w1[i]);
                   int count2=Math.min(num[i],k/w2[i]);
                   int count=Math.min(count1,count2);
                   f[i][j][k]=f[i-1][j][k];
                   for(int t=1;t<=count;t++) {
                      int temp=f[i-1][j-w1[i]*t][k-w2[i]*t]+t*v[i];
                      if(temp>f[i][j][k])
                          f[i][j][k]=temp;
                   }
               }else{
                   f[i][j][k]=f[i-1][j][k];
               }




        value=f[n][c1][c2];
        int z=c2;
        int y=c1;
        int x=n;
        while(x!=0){
            int count1=Math.min(num[x],y/w1[x]);
            int count2=Math.min(num[x],z/w2[x]);
            int count=Math.min(count1,count2);
            for(int k=count;k>0;k--){
                if(f[x][y][z]==(f[x-1][y-k*w1[x]][z-k*w2[x]]+k*v[x])){
                    res[x]=k;
                    y=y-k*w1[x];
                    z=z-k*w2[x];
                    break;
                }
            }
            x--;
        }


        return value;
    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值