您的位置:首页 > 其它

背包问题的贪心算法求解

2016-03-20 16:56 429 查看
背包问题的贪心算法求解

先看代码如下:

public static void knapsackProblems() {
Scanner in = new Scanner(System.in);
System.out.println("Please enter the number of objects(请输入物品的数量:):");
int n = in.nextInt();
int[] w = new int
; // 物品重量数组
int[] v = new int
; // 物品价钱数组
System.out.println("Now, please enter the weight of these objects(现在请输入这些物品的重量:)");
for (int i = 0; i < n; i++) {
w[i] = in.nextInt();
}
System.out.println("Now, please enter the value of these objects(现在请输入这些物品的价值:)");
for (int i = 0; i < n; i++) {
v[i] = in.nextInt();
}
System.out.println("Now, please enter the capacity of the pack(现在请输入背包的容量:)");
int c = in.nextInt();
/**
* 按单位重量价值r[i] = v[i] / w[i]降序排列
*
* ps:排序用到了选择排序,详情请查看选择排序
*/
double[] r = new double
;
int[] index = new int
;
for (int i = 0; i < n; i++) {
r[i] = (double) v[i] / (double) w[i];
index[i] = i;
}
double temp = 0;
for (int i = 0; i < n - 1; i++) {
for (int j = i + 1; j < n; j++) {
if (r[i] < r[j]) {
temp = r[i];
r[i] = r[j];
r[j] = temp;
int x = index[i];
index[i] = index[j];
index[j] = x;
}
}
}
/**
* 排序后的重量和价值分别存到w1[]和v1[]中
*/
int[] w1 = new int
;
int[] v1 = new int
;
for (int i = 0; i < n; i++) {
w1[i] = w[index[i]];
v1[i] = v[index[i]];
}
/**
* 初始化解向量x

*/
int[] x = new int
;
for (int i = 0; i < n; i++) {
x[i] = 0;
}
/**
* 求解并打印解向量
*/
for (int i = 0; i < n; i++) {
if (w1[i] <= c) {
x[i] = 1;
c = c - w1[i];
}
}
System.out.println("The solution vector is(解向量是:)" + Arrays.toString(x));
/**
* 根据解向量求出背包中存放物品的最大价值并打印
*/
int maxValue = 0;
for (int i = 0; i < n; i++) {
if (x[i] == 1)
maxValue += v1[i];
}
System.out.println("Now, the largest values of objects in the pack is(背包中物品的最大价值为:)" + maxValue);
}

补充说明:
1、每件物品只有一件。

2、放入背包的顺序,是单位重量价值最高的物品。(此处即是贪心算法的策略)

3、index[x]数组用于保存物品的编号。这样排序以后,就能通过这个序号,找出相应物品的重量和价值。

4、算法执行前,初始条件是背包中未放入任何物品,即x[i]  = 0;放入则值为1.

5、背包中物品的最大值为maxValue.

参考文章:

1、http://blog.csdn.net/double501/article/details/5895201
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息