在0/1背包问题中,如果两个项目具有相同的值,我该如何选择项目。应该选择重量较小的值,如何检查该状况?我使用动态编程具有以下功能。

static int[] knapsack(int maxWeight, double[] weight, double[] value, int n) {
    //n = no. if items
    int i, w;

    double array[][] = new double[n + 1][maxWeight + 1];
    for (i = 0; i <= n; i++) {
        for (w = 0; w <= maxWeight; w++) {
            if (i == 0 || w == 0)
                array[i][w] = 0;
            else if (weight[i - 1] <= w)
                array[i][w] = max(value[i - 1] + array[i - 1][(w -(int) weight[i - 1])], array[i - 1][w]);
            else
                array[i][w] = array[i - 1][w];
            if (i != 0 || w != 0)
                System.out.print(array[i][w] + "\t");
        }
        System.out.println();
    }

    int[] selected = new int[n + 1];
    for (int j = n, wt = maxWeight; j > 0; j--) {
        if (array[j][wt] != array[j - 1][wt]) {
            if (array[j][wt] == array[j][wt - 1]) {
                selected[j] = 0;
                break;
            }
            selected[j] = 1;
            wt = wt - (int) weight[j - 1];
        }
        else
            selected[j] = 0;
    }
    /** Print finally selected items **/
    System.out.println("\nItems selected : ");
    for (int k = 1; k < n + 1; k++)
        if (selected[k] == 1)
            System.out.print(k +" ");
        System.out.println();

        return selected;
}

对于这种情况:(i,v):(4,45)(3,20)(5,30)(2,45),maxWeight = 5;
如果第1项和第4项具有相同的值,则应选择重量较小的第4项。如何在上面的代码中实现此条件。
问题陈述 :

您的目标是确定要放入哪些内容
包装,使总重量小于或等于包装
限制,并且总费用尽可能大。你宁愿
如果重量超过一个,则发送重量较轻的包裹
价格相同的包裹。

最佳答案

如果您想最大化值,而将最小化则将的重量最小化。你可以检查一下

令DP [i] [j]为可获得的最大值!

W [i] [j]将要使用的最小重量!

然后,

if(Current Weight > Element's Weight)
{
      if(DP[i-1][j-Weight[i]]+Value[i]>DP[i-1][j]){
             DP[i][j]=DP[i-1][j-Weight[i]]+Value[i];
             Weight[i][j]= Weight[i-1][j-Weight[i]]+Value[i]
      }
      else if(DP[i-1][j-Weight[i]]+Value[i] <  DP[i-1][j] ){
             DP[i][j]=DP[i-1][j];
             Weight[i][j]=Weight[i-1][j];
      }
      else{                   //Note this is the tricky part elsewise the
                              //Above conditions are simple Knapsack conditions

             DP[i][j]=DP[i-1][j];   //Both of them are equal We will get same Value . Thus we cannot maximise it in any other way!!
             Weight[i][j]=minimum ( Weight[i-1][j] ,Weight[i-1][j-Weight[i]]+A[i]);

      }
}
else
{
             DP[i][j]=DP[i-1][j];
             Weight[i][j]=Weight[i-1][j];
}

请注意,除非第一个条件为第三个条件,否则该解决方案是微不足道的!
我们需要不惜一切代价使乐趣最大化!所以我们不为所动!
但是,当两种情况下的乐趣相同时,我们需要选择重量更轻的背包,否则,对于相同的背包价值,我们最终将拥有更多的重量!

我假设您知道背包0/1问题,这就是为什么我没有解释第一和第二个条件的原因!

10-06 12:40