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

解决我的运动有问题。 我读到了动态编程和算法,我认为我的练习是“特定的背包问题”。 我用蛮力方法解决了它,但我无法用动态编程解决它。

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

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

更具体地说,我会推荐这个具体的问题和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