0-1背包问题(双限制条件)

0-1背包问题(双限制条件),第1张

给定n种物品和一个背包。物品i的重量是wi,体积是bi,其价值为vi,背包的容量为c,容积为d。问应如何选择装入背包中的物品,使得装入背包中物品的总价值最大? 在选择装入背包的物品时,对每种物品只有两个选择:装入或不装入,且不能重复装入。输入数据的第一行分别为:背包的容量c,背包的容积d,物品的个数n。接下来的n行表示n个物品的重量、体积和价值。输出为最大的总价值。

输入样例:

20   15    3

11   7     9

9    5     10

7    10    5

输出样例

19

public class 动态规划算法 {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int c=sc.nextInt();//背包的容量
        int d=sc.nextInt();//背包的体积
        int n=sc.nextInt();//物品的数量

        int[] w=new int[n+1];//物品的重量
        int[] b=new int[n+1];//物品的体积
        int[] v=new int[n+1];//物品的价值

        for (int i = 1; i < w.length; i++) {
            w[i]=sc.nextInt();
            b[i]=sc.nextInt();
            v[i]=sc.nextInt();
        }
        System.out.println(Track(c,d,n,w,b,v));
    }

    public static int Track(int c,int d,int n,int[] w,int[] b,int[] v){
        int[][][] value=new int[n+1][c+1][d+1];
        //int[][][] path=new int[n+1][c+1][d+1];
        for (int i = 1; i < n+1; i++) {
            for (int j = 1; j < c+1; j++) {
                for (int k = 1; k < d+1; k++) {
                    if(j-w[i]>=0&&k-b[i]>=0){
                        value[i][j][k]=Math.max(value[i-1][j][k],value[i-1][j-w[i]][k-b[i]]+v[i]);
                    }
                    else {
                        value[i][j][k]=value[i-1][j][k];
                    }

                }
            }
        }
        return value[n][c][d];

    }
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/720896.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-25
下一篇 2022-04-25

发表评论

登录后才能评论

评论列表(0条)

保存