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

背包问题总结

在这里插入图片描述
例如:有5件物品,体积分别为[2,2,6,5,4],价值分别为[6,3,5,4,6]
在这里插入图片描述

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
*/

在这里插入图片描述

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 <=0 ; 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.二进制优化多重背包

在这里插入图片描述

发布了89 篇原创文章 · 获赞 42 · 访问量 3655

猜你喜欢

转载自blog.csdn.net/weixin_43673156/article/details/105235530
今日推荐