0-1背包问题及其贪婪算法

uubf1zoe  于 2022-09-17  发布在  Java
关注(0)|答案(8)|浏览(178)

好的,所以,对于那些不熟悉0-1背包问题的人,我必须写一篇文章来计算10个物品的重量和相应的值,并找出哪些物品应该放在一个能装85磅的背包中,以使背包的最大值。
我经常遇到编译器错误,老实说,我真的很不擅长调试。
代码:

// The "Knapsack" class. 
public class Knapsack 
{ 
    public static void main (String[] args) 
    {   int n; 
    int nmax = 10; 
    int wmax = 85; 
    int w; 
    int addVal;   
    int itemArray = new int [2][nmax];   
    int solArray = new int [nmax][wmax];   
    itemArray = {{10, 63, 84, 81, 33, 11, 67, 10, 65, 81}, { 9, 19, 5, 31, 48, 17, 46, 80, 38, 55}};     
    //This section of code fills the first row of the Solution Array 
    while(w <= wmax){   
        if (itemArray [0][0] < w){ 
        solArray[0][w] = itemArray[0][1]; 
        }   
        else solArray[0][w] = 0;   
    }       
     for (n = 1; n <= nmax-1; n++){   
        for(w = 1; w <= wmax-1; w++){   
            //checks to see if the item being looked at weighs more than the subproblem can carry 
            if (itemArray[0][n] > w){ 
                solArray[n][w] = solArray[n-1][w]; 
            }   
            //adds together the values of the previous subproblem and the current iteration of n 
            //and checks if it is of greater value than the previous row 
            addVal = solArray[n-1][w-itemArray[0][n]] + itemArray[1][n]; 
            if (addVal > solArray[n-1][w]){ 
            solArray[n][w] = addVal; 
            }   
            //if only the current item can be fit in the knapsack, checks if the item is more valuable than the value in the row above               
            else if (w >= itemArray[0][n] && solArray[n-1][w] < itemArray[1][n]) 
            {solArray[n][w] = itemArray[1][n];}   
            else solArray[n][w] = solArray[n-1][w];     
        }        
    }     
    n = nmax-1; 
    w = wmax-1; 
    int includeArray = new int[i]; 
    int i = 0;   
    //populates a 1-dimensional array with the numbers of the items filling the knapsack in the optimal solution 
    while (n <= 0){ 
        if ((solArray[n][w] != solArray[n-1][w]) && (solArray [n-1][w] != 0)){ 
            includeArray[i] = n; 
            w = w - itemArray[0][n]; 
            i++; 
        }   
            n--; 
    }          
    includeArray.length = i;   
    //print out solution array 
    for (n = 0; n <= nmax; n++){ 
        for (w = 0; w <=wmax; w++){ 
            System.out.println(solArray[n][w]); 
        } 
    }   
    } // main method 
} // Knapsack class

P、 S.Noooooo,论坛把我所有的漂亮缩进都弄乱了!

lrl1mhuk

lrl1mhuk1#

请在[code]标签中附上您发布的代码(请参阅如何提问)。
这使我们的Maven更容易阅读和理解。不这样做会给主持人带来额外的工作,从而浪费资源,否则就无法回答成员的问题。
请以后使用[代码]标签。
主持人
呵呵,谢谢!我显然需要学习阅读。

uqjltbpv

uqjltbpv2#

知道语法是编程的先决条件。这不是调试。无论如何,我会让您开始:用于分配数组变量的语法只能用于initialize数组:

int[][] itemArray = {{10, 63, 84, 81, 33, 11, 67, 10, 65, 81}, { 9, 19, 5, 31, 48, 17, 46, 80, 38, 55}};  
hec6srdp

hec6srdp3#

啊,谢谢,我对我的数组和Java有点生疏了……因为某种原因,我无法理解它的语法。

nnvyjq4y

nnvyjq4y4#

啊,谢谢,我对我的数组和Java有点生疏了……因为某种原因,我无法理解它的语法。
我留下了一些语法错误供您修复;-)

2guxujil

2guxujil5#

我留下了一些语法错误供您修复;-)
好吧,有一件事我一直有问题,我肯定是不对的,那就是我的includeArray[]
如何处理一个直到下面的while循环被迭代之后才知道长度的数组?

qxgroojn

qxgroojn6#

好吧,有一件事我一直有问题,我肯定是不对的,那就是我的includeArray[]
如何处理一个直到下面的while循环被迭代之后才知道长度的数组?
最好的方法是根本不使用数组。我很少使用数组,除了一些简单的用途。使用适当的集合类:
http://java.sun.com/docs/books/tutor...ons/index.html

ndh0cuux

ndh0cuux7#

背包0-1&rosettacode&qbasic qb64&WE
经典背包问题有很多解决方法
内容:http://rosettacode.org/wiki/Knapsack_problem
长期阅读:rosettacode.org/wiki/背包_problem/0-1
我的最新程序综合了0和1的所有密码
添加一个额外的寄存器,密码中左侧保留0
比较次数从N减少!到2^N
例如N=5N=120>>2^N=32
自动指定随机值原点
得到了数值的数量、质量和积分
一般而言:数量和质量的积分
而且有可能分裂,只有任何人都不会理解
程序将结果写入qb64目录

Open "knapsack.txt" For Output As #1 
N=7: L=5: a = 2^(N+1): Randomize Timer 'knapsack.bas DANILIN 
Dim L(N), C(N), j(N), q(a), q$(a), d(a)   
For m=a-1 To (a-1)/2 Step -1: g=m: Do ' sintez shifr 
    q$(m)=LTrim$(Str$(g Mod 2))+q$(m) 
    g=g\2: Loop Until g=0 
    q$(m)=Mid$(q$(m), 2, Len(q$(m)))  
Next   
For i=1 To N: L(i)=Int(Rnd*3+1) ' lenght & cost 
C(i)=10+Int(Rnd*9): Print #1, i, L(i), C(i): Next ' origin   
For h=a-1 To (a-1)/2 Step -1 
    For k=1 To N: j(k)=Val(Mid$(q$(h), k, 1)) ' from shifr 
        q(h)=q(h)+L(k)*j(k)*C(k) ' 0 or 1 
        d(h)=d(h)+L(k)*j(k) 
    Next 
    If d(h) <= L Then Print #1, d(h), q(h), q$(h) 
Next 
max=0: m=1: For i=1 To a 
    If d(i)<=L Then If q(i) > max Then max=q(i): m=i 
Next 
Print #1,: Print #1, d(m), q(m), q$(m): End

主要的事情是非常简短和清楚的,甚至所有人
结果手动减少:

 1             2             17  
 2             2             14  
 3             2             17  
 4             1             11  
 5             2             18  
 6             3             14  
 7             3             10    
 5             73           1101000 
 2             28           0100000 
 5             81           0011100 !!! 
 3             45           0011000 
 5             76           0010010 
 2             36           0000100   
 5             81           0011100
ru9i0ody

ru9i0ody8#

请在[code]标签中附上您发布的代码(请参阅如何提问)。
这使我们的Maven更容易阅读和理解。不这样做会给主持人带来额外的工作,从而浪费资源,否则就无法回答成员的问题。
请以后使用[代码]标签。
主持人

相关问题