动态规划背包问题总结-java

背包问题总结

动态规划背包问题总结-java_第1张图片
例如:有5件物品,体积分别为[2,2,6,5,4],价值分别为[6,3,5,4,6]
动态规划背包问题总结-java_第2张图片

1:01背包

//0-1背包问题
import java.util.*;
public class ll {
     
    public static void main(String[] args) {
     
        int c[]=new int[105];
        int w[]=new int [105];
        int dp[][]=new int[105][105];
        Scanner scanner=new Scanner(System.in);
        int n=scanner.nextInt();
        int v=scanner.nextInt();
        for (int i = 1; i <=n ; i++) {
     
            w[i]=scanner.nextInt();//物体价值
            c[i]=scanner.nextInt();//每件物体体积
        }
        for (int i = 1; i <=n ; i++) {
     //前i个物品
            for (int j = 0; j <=v ; j++) {
     
                if (j>=c[i]){
     
                    dp[i][j]=Math.max(dp[i-1][j-c[i]]+w[i],dp[i-1][j]);
                }else {
     
                    dp[i][j]=dp[i-1][j];
                }
            }
        }
        System.out.println(dp[n][v]);
    }
}
/*
--cin: 
5 10 //数量 体积 
2 1 //单件价值 重量 
3 5
2 5
3 4
4 3
--cout: //最大价值 
9
*/

动态规划背包问题总结-java_第3张图片

import java.util.*;
public class ll {
     
    public static void main(String[] args) {
     
        int c[]=new int[105];
        int w[]=new int [105];
        int dp[]=new int[105];
        Scanner scanner=new Scanner(System.in);
        int n=scanner.nextInt();
        int v=scanner.nextInt();
        for (int i = 1; i <=n ; i++) {
     
            w[i]=scanner.nextInt();//物体价值
            c[i]=scanner.nextInt();//每件物体体积
        }
        for (int i = 1; i <=n ; i++) {
     //前i个物品
            for (int j = v; j >=c[i] ; j--) {
     
                dp[j]=Math.max(dp[j-c[i]]+w[i],dp[j]);
            }
        }
        System.out.println(dp[v]);
    }
}

01背包问题魔改
用 价值/体积 得到单位体积物品的价值量
并 从高到低 进行排序,在总体积允许的范围内
尽可能选择 单位价值 更高的物品

import java.util.*;
public class ll {
     
    public static class cmp implements Comparator<Bao>{
     
        @Override
        public int compare(Bao a, Bao b) {
     
            return b.w/b.c-a.w/a.c;
        }
    }
    public static class Bao{
     
        int w;
        int c;
    }
    public static void main(String[] args) {
     

        Scanner scanner=new Scanner(System.in);
        int n=scanner.nextInt();
        int v=scanner.nextInt();
        Bao bao[]=new Bao[n];
        for (int i = 0; i <n ; i++) {
     
            bao[i]=new Bao();
            bao[i].w=scanner.nextInt();//物体价值
            bao[i].c=scanner.nextInt();//每件物体体积
        }

        Arrays.sort(bao,new cmp());
        int sumw=0,sumc=0;
        for (int i = 0; i < n; i++) {
     
            int tc=sumc+bao[i].c;
            int tw=sumw+bao[i].w;
            if(tw>sumw&&tc<v){
     
                sumw=tw;
                sumc=tc;
            }
        }

        System.out.println(sumw);
    }
}

2.多重背包

有N种物品,第i种物品的体积是Ci ,价值是Wi,每种物品有 Ni 件,有体积为V的背包,求最大价值
在这里插入图片描述
01背包就是特殊的多重背包(多重背包里面Ni件物品相当于01背包中Ni件相同的物品)

import java.util.*;
public class ll {
     
    public static void main(String[] args) {
     
        int [][]dp=new int[21][1010];
        int w[]=new int[21];
        int c[]=new int[21];
        int n[]=new int[21];
        Scanner scanner=new Scanner(System.in);
        int N=scanner.nextInt();//物体数
        int V=scanner.nextInt();//体积
        for (int i = 1; i <=N ; i++) {
     
            w[i]=scanner.nextInt();//价格
            c[i]=scanner.nextInt();//体积
            n[i]=scanner.nextInt();//个数
        }
        for (int i = 1; i <=N ; i++) {
     //前i个物品
            for (int j = 0; j <=V ; j++) {
     
                for (int k = 0; k <=n[i] ; k++) {
     
                    if (j>=c[i]*k){
     
                        dp[i][j]=Math.max(dp[i-1][j-c[i]*k]+w[i]*k,dp[i][j]);
                    }
                }
            }
        }
        System.out.println(dp[N][V]);

    }
}
import java.util.*;
public class ll {
     
    public static void main(String[] args) {
     
        int [][]dp=new int[21][1010];
        int w[]=new int[21];
        int c[]=new int[21];
        int n[]=new int[21];
        Scanner scanner=new Scanner(System.in);
        int N=scanner.nextInt();//物体数
        int V=scanner.nextInt();//体积
        for (int i = 1; i <=N ; i++) {
     
            w[i]=scanner.nextInt();//价格
            c[i]=scanner.nextInt();//体积
            n[i]=scanner.nextInt();//个数
        }
        for (int i = 1; i <=N ; i++) {
     //前i个物品
            for (int j = V; j>=0 ; j++) {
     
                for (int k = 0; k <=n[i] ; k++) {
     
                    if (j>=c[i]*k){
     
                        dp[j]=max(dp[j-c[i]*k]+w[i]*k,dp[j]);
                    }
                }
            }
        }
        System.out.println(d[V]);

    }
}

3.完全背包

当前有N中物品,第i中物品的体积是Ci ,价值是 Wi
每种物品的数量是无限的,可以选若干件,
有容量为 V 的背包,求最大价值

import java.util.*;
public class ll {
     
    public static void main(String[] args) {
     
        int c[]=new int[21];
        int w[]=new int [21];
        int dp[][]=new int[21][1010];
        Scanner scanner=new Scanner(System.in);
        int n=scanner.nextInt();
        int v=scanner.nextInt();
        for (int i = 1; i <=n ; i++) {
     
            w[i]=scanner.nextInt();//物体价值
            c[i]=scanner.nextInt();//每件物体体积
        }
        for (int i = 1; i <=n ; i++) {
     //前i个物品
            for (int j = 0; j <=v ; j++) {
     
                if(j>=c[i]){
     
                    dp[i][j]=Math.max(dp[i][j-c[i]]+w[i],dp[i-1][j]);
                }else{
     
                    dp[i][j]=dp[i-1][j];
                }
            }
        }
        System.out.println(dp[n][v]);
    }
}
import java.util.*;
public class ll {
     
    public static void main(String[] args) {
     
        int c[]=new int[21];
        int w[]=new int [21];
        int dp[][]=new int[21][1010];
        Scanner scanner=new Scanner(System.in);
        int n=scanner.nextInt();
        int v=scanner.nextInt();
        for (int i = 1; i <=n ; i++) {
     
            w[i]=scanner.nextInt();//物体价值
            c[i]=scanner.nextInt();//每件物体体积
        }
        //空间优化 
	    for(int i=1;i<=N;i++){
     
			for(int j=c[i];j<=V;j++){
     
				dp[j]=max(dp[j-c[i]]+w[i],dp[j]);
		}
	}
        System.out.println(dp[v]);
    }
}

4.二进制优化多重背包

动态规划背包问题总结-java_第4张图片

你可能感兴趣的:(#,动态规划,动态规划)