首页 > 其他分享 >01背包

01背包

时间:2023-07-26 20:00:17浏览次数:25  
标签:13 01 capacity int 背包 放入

01背包问题


public class KnapsackProblem {
    public static void main(String[] args) {
        int []w={1,2,3,4,5};
        int[]value={3,4,6,8,10};
        int capacity=10;
        int n=w.length;
        ZeroOneKnapsack(w,value,n,capacity);
    }

    /**
     *
     * @param w 重量
     * @param value 价值
     * @param n 种类
     * @param capacity 容量
     */
    public static void ZeroOneKnapsack(int[]w,int[]value,int n,int capacity){
        //因为第一行均为0,所以要加1
        //第一行和第一列我们都不会用到,目的是为了更好的理解01背包
        int[][]v=new int[n+1][capacity+1];
        //因为v[0][j]和v[i][0]不处理默认为0
        //记录路径
        int [][]path=new int[n+1][capacity+1];
        for (int i = 1; i < n+1; i++) {
            for (int j = 1; j < capacity+1; j++) {
                if(w[i-1]>j){
                    //如果背包的容量小于当前商品的重量7
                  v[i][j]=v[i-1][j];
                }else {
                    if(v[i-1][j]<value[i-1]+v[i-1][j-w[i-1]]){
                        v[i][j]=value[i-1]+v[i-1][j-w[i-1]];
                        path[i][j]=1;
                    }else {
                        v[i][j]= v[i-1][j];
                    }
                }
            }
        }
        for (int i = 0; i < n+1; i++) {
            for (int j = 0; j < capacity+1; j++) {
                if(v[i][j]<10){
                    System.out.print(v[i][j]+"  ");
                }else {
                    System.out.print(v[i][j]+" ");
                }
            }
            System.out.println();
        }
        for (int i = 0; i < n+1; i++) {
            for (int j = 0; j < capacity+1; j++) {
                System.out.print(path[i][j]+"  ");
            }
            System.out.println();
        }
        int i=path.length-1;
        int j=path[0].length-1;
        while (i>0&&j>0){
            if(path[i][j]==1){
                System.out.println("商品"+i+"放入背包");
                //这里是和之前一样,我放入背包一件商品,那么我的容量也要对应的减少
                //不可能说我容量为20,容量不减少,那么就会重复
                j-=w[i-1];
            }
            i--;
        }
       /* return v[n+1][capacity];*/
    }

}

0  0  0  0  0  0  0  0  0  0  0  
0  3  3  3  3  3  3  3  3  3  3  
0  3  4  7  7  7  7  7  7  7  7  
0  3  4  7  9  10 13 13 13 13 13 
0  3  4  7  9  11 13 15 17 18 21 
0  3  4  7  9  11 13 15 17 19 21 
0  0  0  0  0  0  0  0  0  0  0  
0  1  1  1  1  1  1  1  1  1  1  
0  0  1  1  1  1  1  1  1  1  1  
0  0  0  0  1  1  1  1  1  1  1  
0  0  0  0  0  1  0  1  1  1  1  
0  0  0  0  0  0  0  0  0  1  0  
商品4放入背包
商品3放入背包
商品2放入背包
商品1放入背包
输出结果如上

标签:13,01,capacity,int,背包,放入
From: https://www.cnblogs.com/cgy-chen/p/17583423.html

相关文章

  • 正点原子Ubuntu入门011---vim编辑器
    一、vim编辑器安装vim编辑器sudoapt-getinstallvim 二、vim编辑器的三种工作模式vi  xxx  使用vi编辑器打开文件一般模式(指令模式):使用vi打开一个文件以后自动进入到此模式编辑模式:一般模式中无法编辑文件,要编辑输入文件就要进入编辑模式,按下“i、I、a、A、o......
  • NC19981 [HAOI2010]软件安装
    NC19981[HAOI2010]软件安装一、题目描述现在我们的手头有\(N\)个软件,对于一个软件\(i\),它要占用\(W_i\)的磁盘空间,它的价值为\(V_i\)。我们希望从中选择一些软件安装到一台磁盘容量为\(M\)计算机上,使得这些软件的价值尽可能大(即\(V_i\)的和最大)。但是现在有个问题:软件之间存在......
  • P5369 [PKUSC2018] 最大前缀和 题解
    传送门题目大意给定一个序列,求任意重排\(n!\)中情况所以的最大非空前缀和的和。模\(998244353\)。\(n\e20\),\(\sum|a_i|\le10^9\)题目解析考虑最大前缀和的性质,有:对于最大前缀和部分,所有的真后缀大于等于零。(最大前缀和可能小于零)对于不在最大前缀和的后半部分,所......
  • InDesign (ID) 2018排版设计软件下载和安装教程
    InDesign软件是一个定位于专业排版领域的设计软件,是面向公司专业出版方案的新平台,由Adobe公司于1999年9月1日发布。它是基于一个新的开放的面向对象体系,可实现高度的扩展性,还建立了一个由第三方开发者和系统集成者可以提供自定义杂志、广告设计、目录、零售商设计工作室和报纸出版......
  • AT_agc017_b 题解
    洛谷链接&Atcoder链接本篇题解为此题较简单做法,请放心阅读。题目简述一共有\(n\)个格子,给定两个整数\(A,B\)分别位于第\(1\)和第\(n\)格,中间有\(n−2\)个空格。询问是否存在一种填数方案满足任意相邻两个数之差的绝对值在\([C,D]\)之间。依次输入\(n,a,b,c,d\)......
  • Oracle日常性能问题查看 转载 https://www.cnblogs.com/yhq1314/p/10601630.html
    1判断回滚段竞争的sql--当Ratio大于2时存在回滚段竞争,需要增加更多的回滚段)selectrn.name,rs.GETS,rs.WAITS,(rs.WAITS/rs.GETS)*100ratiofromv$rollstatrs,v$rollnamernwherers.USN=rn.usn;2判断恢复日志竞争的sql,这句有问题不能使用--immediate_con......
  • 01-[Linux][GPIO]GPIO编程示例代码
    基于MTK平台的AndroidLinux驱动1、DTS配置如下gpio_sample:gpio_sample{compatible="mediatek,gpio-sample";input,high-gpio=<&pio77GPIO_ACTIVE_HIGH>;input,low-gpio=<&pio70GPIO_ACTIVE_HIGH>;out......
  • Unsupervised Learning of Depth and Ego-Motion from Video(CVPR2017)论文阅读
    深度估计问题 从输入的单目或双目图像,计算图像物体与摄像头之间距离(输出距离图),双目的距离估计应该是比较成熟和完善,但往单目上考虑主要还是成本的问题,所以做好单目的深度估计有一定的意义。单目的意思是只有一个摄像头,同一个时间点只有一张图片。就象你闭上一只眼睛,只用一......
  • 替代GSV6201方案 集睿致远芯片CS5466 Type-c转HDMI8K高刷方案 CS5466完美代替RTD2173
    GSV6201基石是国内首款TPYEC转HDMI8K芯片。随着视频采集及显示设备日新月异的发展,用户对于高画质及低延时的观感体验追求越来越高,HDMI2.1传输技术的出现让这一切成为可能;它可以在动态帧率变化、高动态范围(HDR)和更多的音频传输方式比如eARC等方面实现提升,可以JIA一下幺三6玖二二72......
  • 013 学习笔记--锁
    锁:全局锁:锁定数据库中的所有表表级锁:每次操作锁住整张表行级锁:每次操作锁住对应的行数据1.概述锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资源(CUP、RAM、IO)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性......