栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

0-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];

    }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/827184.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号