我该如何解决? KnapSack - 值全部相同,但每个其他对象有三个权重

时间:2016-11-02 18:24:07

标签: java algorithm dynamic knapsack-problem

解决我的运动时遇到问题。我读到了动态编程和算法,我认为我的练习是"具体的背包问题"。我用蛮力方法解决了这个问题,但我无法通过动态编程来解决它。

我有一艘重达300吨的船(背包)。存在晶体本身具有3种物质(X,Y,Z) - 彼此物质具有重量并且所有晶体具有相同的值。我需要打包尽可能多的水晶,但所有包装晶体的物质比例必须是1:1:1。但是,例如,如果我有三个比例为1:1:1的晶体,它们产生最大的吨数,八个晶体产生相同数量的晶体(另外两个晶体组合产生最大吨数),我需要选择晶体数量最少的组合。

我用强力方法解决了它 - 我创建了一个包含所有组合的数组列表。接下来,我发现它们的比例为1:1:1。接下来,我发现这种组合产生了最大的吨数,并且具有最少的晶体数量(如果有两个或更多组合具有相同的最大吨数)。我检查了测试,结果很好, 我不知道如何通过动态编程来解决它; /有人帮助我吗?

例如,当我有10个晶体时:

 1) X =2 Y =3 Z =4
 2) X =5 Y=10 Z =2
 3) X =3 Y =3 Z =3
 4) X =1 Y =0 Z =6
 5) X =9 Y=12 Z =4
 6) X =1 Y =1 Z =1
 7) X =2 Y =1 Z=0
 8) X =1 Y =2 Z =3
 9) X =1 Y =1 Z =1
10) X =4 Y =3 Z =3

解决方案是:最多27吨,含五个晶体(数字:1,3,6,7和9)

1 个答案:

答案 0 :(得分:0)

互联网上有一些很好的教程可以彻底解释背包问题。

更具体地说,我建议this specific one,完全解释问题和DP方法,包括三种不同语言(包括Java)的解决方案。

// A Dynamic Programming based solution for 0-1 Knapsack problem
class Knapsack
{
    // A utility function that returns maximum of two integers
    static int max(int a, int b) { return (a > b)? a : b; }

   // Returns the maximum value that can be put in a knapsack of capacity W
    static int knapSack(int W, int wt[], int val[], int n)
    {
         int i, w;
     int K[][] = new int[n+1][W+1];

     // Build table K[][] in bottom up manner
     for (i = 0; i <= n; i++)
     {
         for (w = 0; w <= W; w++)
         {
             if (i==0 || w==0)
                  K[i][w] = 0;
             else if (wt[i-1] <= w)
                   K[i][w] = max(val[i-1] + K[i-1][w-wt[i-1]],  K[i-1][w]);
             else
                   K[i][w] = K[i-1][w];
         }
      }

      return K[n][W];
    }

    // Driver program to test above function
    public static void main(String args[])
    {
        int val[] = new int[]{60, 100, 120};
        int wt[] = new int[]{10, 20, 30};
        int  W = 50;
        int n = val.length;
        System.out.println(knapSack(W, wt, val, n));
    }
}
/*This code is contributed by Rajat Mishra */

来源:GeeksForGeeks