我在解决我的练习时遇到问题。我读到了动态规划和算法,我认为我的练习是“特定背包问题”。我用暴力法解决了它,但我无法用动态规划解决它。
我有一艘重300吨的船(背包)。有些晶体本身含有 3 种物质(X、Y、Z) - 每种物质都有重量,并且所有晶体都具有相同的值。我需要包装运输尽可能多的晶体,但所有包装晶体的物质比例必须是1:1:1。但例如,如果我有 3 个比例为 1:1:1 的晶体,给出了最大的吨数,而 8 个晶体给出了相同的吨数(另外两个晶体组合给出了最大的吨数),我需要选择具有最少晶体数量的组合。
我用蛮力方法解决了它 - 我创建了所有组合的数组列表。接下来我发现它们以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)
互联网上有一些很好的教程,可以彻底解释背包问题。
更具体地说,我会推荐这个具体的 http://www.geeksforgeeks.org/dynamic-programming-set-10-0-1-knapsack-problem/,其中完全解释了问题和 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 */
Source: 极客之极客 http://www.geeksforgeeks.org/dynamic-programming-set-10-0-1-knapsack-problem/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)