【问题标题】:How can I solve it? KnapSack - values all the same but each other object has three weights我该如何解决? KnapSack - 值都相同,但每个其他对象都有三个权重
【发布时间】:2017-03-16 04:34:58
【问题描述】:

我在解决我的练习时遇到了问题。我阅读了动态编程和算法,我认为我的练习是“特定的背包问题”。我用蛮力方法解决了,但我不能用动态规划解决它。

我有一艘重 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)

【问题讨论】:

标签: java algorithm dynamic knapsack-problem


【解决方案1】:

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

更具体地说,我会推荐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

【讨论】:

  • 伙计,为什么没人帮我;/我读了这篇文章我创建了一个 K 数组,但它对我没有帮助...
  • 仅链接的答案不是高质量的答案,因为如果链接停止工作,它们将不再有用。请在您的答案中包含链接的基本详细信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-24
  • 2019-01-17
  • 1970-01-01
  • 2018-12-30
  • 2020-12-08
  • 2015-09-15
  • 1970-01-01
相关资源
最近更新 更多