解决我的运动时遇到问题。我读到了动态编程和算法,我认为我的练习是"具体的背包问题"。我用蛮力方法解决了这个问题,但我无法通过动态编程来解决它。
我有一艘重达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)
答案 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 */