<tfoot id='ave0k60o'></tfoot>

        <i id='m8w0ippk'><tr id='6rapla28'><dt id='u8aaamj0'><q id='1f70ly5x'><span id='gvty60ft'><b id='0ssdytjb'><form id='w0vmo5a5'><ins id='i3d2jtaa'></ins><ul id='7hn5rfm8'></ul><sub id='ij48a6x2'></sub></form><legend id='wv8spa95'></legend><bdo id='zoeicqrv'><pre id='pt7ccpfx'><center id='orhomn9w'></center></pre></bdo></b><th id='tl0bwuzt'></th></span></q></dt></tr></i><div id='4zrqjb4h'><tfoot id='gd2yqolo'></tfoot><dl id='8d1p82do'><fieldset id='lqivxt5c'></fieldset></dl></div>
        <legend id='im0h3sq7'><style id='dlk0rbng'><dir id='bcg1jz12'><q id='bphs7syq'></q></dir></style></legend>

        <small id='t1rmbybw'></small><noframes id='qq9um7sb'>

        • <bdo id='7gq8ycbt'></bdo><ul id='7sid3fa9'></ul>

      1. 欢迎来到入门教程网!

        Java编程

        当前位置:主页 > 软件编程 > Java编程 >

        背包问题java代码 java解决背包问题

        来源:本站原创|时间:2023-04-11|栏目:Java编程|点击:

        回溯法解决0-1背包问题 java写的 求大神指点~~~~(>_

        因为你把n和c 定义为static ,而且初始化为0,。数组也为静态的,一个类中静态的变量在这个类加载的时候就会执行,所以当你这类加载的时候,你的数组static int[] v = new int[n];

        static int[] w = new int[n];

        就已经初始化完毕,而且数组大小为0。在main方法里动态改变n的值是改变不了已经初始化完毕的数组的大小的,因为组已经加载完毕。

        我建议你可以在定义n,c是就为其赋初值。比如(static int n=2 static int c=3)

        java语言,背包问题,从Excel表中读取数据

        基本概念

        问题雏形

        01背包题目的雏形是:

        有N件物品和一个容量为V的背包。第i件物品的体积是c[i],价值是w[i]。求解将哪些物品装入背包可使价值总和最大。

        从这个题目中可以看出,01背包的特点就是:每种物品仅有一件,可以选择放或不放。

        其状态转移方程是:

        f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]}

        对于这方方程其实并不难理解,方程之中,现在需要放置的是第i件物品,这件物品的体积是c[i],价值是w[i],因此f[i-1][v]代表的就是不将这件物品放入背包,而f[i-1][v-c[i]]+w[i]则是代表将第i件放入背包之后的总价值,比较两者的价值,得出最大的价值存入现在的背包之中。

        理解了这个方程后,将方程代入实际题目的应用之中,可得

        for (i = 1; i = n; i++)

        for (j = v; j = c[i]; j--)//在这里,背包放入物品后,容量不断的减少,直到再也放不进了

        f[i][j] = max(f[i - 1][j], f[i - 1][j - c[i]] + w[i]);

        问题描述

        求出获得最大价值的方案。

        注意:在本题中,所有的体积值均为整数。

        算法分析

        对于背包问题,通常的处理方法是搜索。

        用递归来完成搜索,算法设计如下:

        int make(int i, int j)//处理到第i件物品,剩余的空间为j 初始时i=m , j=背包总容量

        {

        if (i == 0) return 0;

        if (j = c[i])//(背包剩余空间可以放下物品 i )

        {

        int r1 = make(i - 1, j - w[i]);//第i件物品放入所能得到的价值

        int r2 = make(i - 1, j);//第i件物品不放所能得到的价值

        return min(r1, r2);

        }

        return make(i - 1, j);//放不下物品 i

        }

        这个算法的时间复杂度是O(n^2),我们可以做一些简单的优化。

        由于本题中的所有物品的体积均为整数,经过几次的选择后背包的剩余空间可能会相等,在搜索中会重复计算这些结点,所以,如果我们把搜索过程中计算过的结点的值记录下来,以保证不重复计算的话,速度就会提高很多。这是简单的“以空间换时间”。

        我们发现,由于这些计算过程中会出现重叠的结点,符合动态规划中子问题重叠的性质。

        同时,可以看出如果通过第N次选择得到的是一个最优解的话,那么第N-1次选择的结果一定也是一个最优解。这符合动态规划中最优子问题的性质。

        解决方案

        考虑用动态规划的方法来解决,这里的:

        阶段:在前N件物品中,选取若干件物品放入背包中

        状态:在前N件物品中,选取若干件物品放入所剩空间为W的背包中的所能获得的最大价值

        决策:第N件物品放或者不放

        由此可以写出动态转移方程:

        我们用f[i][j]表示在前 i 件物品中选择若干件放在已用空间为 j 的背包里所能获得的最大价值

        f[i][j] = max(f[i - 1][j - W[i]] + P[i], f[i - 1][j]);//j = W[ i ]

        这个方程非常重要,基本上所有跟背包相关的问题的方程都是由它衍生出来的。所以有必要将它详细解释一下:“将前i件物品放入容量为v的背包中”这个子问题,若只考虑第i件物品的策略(放或不放),那么就可以转化为一个只牵扯前i-1件物品的问题。如果不放第i件物品,那么问题就转化为“前i-1件物品放入容量为v的背包中”,价值为f[v];如果放第i件物品,那么问题就转化为“前i-1件物品放入已用的容量为c的背包中”,此时能获得的最大价值就是f[c]再加上通过放入第i件物品获得的价值w。

        这样,我们可以自底向上地得出在前M件物品中取出若干件放进背包能获得的最大价值,也就是f[m,w]

        算法设计如下:

        int main()

        {

        cin n v;

        for (int i = 1; i = n; i++)

        cin c[i];//价值

        for (int i = 1; i = n; i++)

        cin w[i];//体积

        for (int i = 1; i = n; i++)

        f[i][0] = 0;

        for (int i = 1; i = n; i++)

        for (int j = 1; j = v; j++)

        if (j = w[i])//背包容量够大

        f[i][j] = max(f[i - 1][j - w[i]] + c[i], f[i - 1][j]);

        else//背包容量不足

        f[i][j] = f[i - 1][j];

        cout f[n][v] endl;

        return 0;

        }

        由于是用了一个二重循环,这个算法的时间复杂度是O(n*w)。而用搜索的时候,当出现最坏的情况,也就是所有的结点都没有重叠,那么它的时间复杂度是O(2^n)。看上去前者要快很多。但是,可以发现在搜索中计算过的结点在动态规划中也全都要计算,而且这里算得更多(有一些在最后没有派上用场的结点我们也必须计算),在这一点上好像是矛盾的。

        关于这个java语言描述的0-1背包问题是否有错误?

        有点问题:

        public static void knapsack(int[]v,int[]w,int c,int[][]m)

        {

        int n=v.length-1;

        int jMax=Math.min(w[n]-1,c);

        for(int j=0;j=jMax;j++)

        m[n][j]=0;

        for(int j=w[n];j=c;j++)

        m[n][j]=v[n];

        for(int i=n-1;i1;i--)

        {

        jMax=Math.min(w[i]-1,c);

        for(int j=0;j=jMax;j++)

        m[i][j]=m[i+1][j];

        for(int j=w[i];j=c;j++)

        m[i][j]=Math.max(m[i+1][j],m[i+1][j-w[i]]+v[i]);

        }

        m[1][c]=m[2][c];

        if(c=w[1])

        m[1][c]=Math.max(m[1][c],m[2][c-w[1]]+v[1]);

        }

        public static void traceback(int[][]m,int[]w,int c,int[]x)

        {

        int n=w.length-1;

        for(int i=1;in;i++) {

        if(m[i][c]==m[i+1][c])x[i]=0;

        else {

        x[i]=1;

        c-=w[i];

        }

        x[n]=(m[n][c]0)?1:0;

        }

        //int n=w.length-1;

        for(int i=1;in;i++)

        if(m[i][c]==m[i+1][c])x[i]=0;

        else {

        x[i]=1;

        c-=w[i];

        }

        x[n]=(m[n][c]0)?1:0;

        }

      2. <tfoot id='avo394il'></tfoot>

          1. <legend id='7xafi6fm'><style id='xrigjutj'><dir id='idgwertl'><q id='fmmgqlhw'></q></dir></style></legend>
            • <bdo id='lbtxz0ln'></bdo><ul id='k8z1429q'></ul>
                <tbody id='54dd3qcm'></tbody>

                • <small id='cja3v3ni'></small><noframes id='mxirq4jw'>

                • <i id='rezqgink'><tr id='ce6f9qel'><dt id='ne38kroh'><q id='m2rnnbs7'><span id='6zwi82r7'><b id='rdf737we'><form id='lok26tgr'><ins id='6tzr7oqa'></ins><ul id='dlvw4rs3'></ul><sub id='d30pmh41'></sub></form><legend id='8297rwod'></legend><bdo id='ns4pihi3'><pre id='royldl8k'><center id='3378ebeo'></center></pre></bdo></b><th id='ennbkdwn'></th></span></q></dt></tr></i><div id='g3tyt7t8'><tfoot id='cwaa00jb'></tfoot><dl id='xiox56lb'><fieldset id='yxtgy41q'></fieldset></dl></div>

                  上一篇:java调用不同模块代码 java不同包怎样调用

                  栏    目:Java编程

                  下一篇:没有了

                  本文标题:背包问题java代码 java解决背包问题

                  本文地址:https://www.xiuzhanwang.com/a1/Javabiancheng/17378.html

                  网页制作CMS教程网络编程软件编程脚本语言数据库服务器

                  如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

                  联系QQ:835971066 | 邮箱:835971066#qq.com(#换成@)

                  Copyright © 2002-2020 脚本教程网 版权所有

                      <tfoot id='74iyzeyv'></tfoot>
                    1. <legend id='2yyp5pog'><style id='xoxo2xe2'><dir id='823szwe6'><q id='bat1tjx0'></q></dir></style></legend>

                      <small id='z048bndu'></small><noframes id='s5e1i1te'>

                        <bdo id='p8z4z3qq'></bdo><ul id='6u9v7c12'></ul>

                    2. <i id='6gjmpssv'><tr id='6kdcv336'><dt id='ydli49lj'><q id='fiuv67gu'><span id='yy1rmwe2'><b id='vh6a35m8'><form id='b6t4a6yj'><ins id='l561oq05'></ins><ul id='0nuep4h0'></ul><sub id='ubu4b6pb'></sub></form><legend id='h9gu5z0r'></legend><bdo id='m76lkyh2'><pre id='x0eihflx'><center id='a32hdx5l'></center></pre></bdo></b><th id='9s2jiawg'></th></span></q></dt></tr></i><div id='bqdqe3ca'><tfoot id='z5lf0qi1'></tfoot><dl id='yzc980hq'><fieldset id='sx92yn2t'></fieldset></dl></div>