代码
package LQB14;
import java.util.Scanner;
/*
* 背包问题
* 贪心准则:重量贪心
*/
public class T8 {
public static Scanner scanner = new Scanner(System.in);
public static int n;// 物品个数
public static float C;// 背包容量
public static float[] weight;// 重量数组
public static float[] value;// 价值数组
// 拷贝的目的是,在后面对重量数组和价值数组进行了排序,打乱了原来的数组顺序,故先拷贝出来一份。
public static float[] v;// 拷贝一份价值数组
public static float[] w;// 拷贝一份重量数组
public static float[] add;// 放入的比例数组
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.print("请输入物品的个数:");
n = scanner.nextInt();
weight = new float[n];
value = new float[n];
v = new float[n];
w = new float[n];
System.out.print("请输入背包的容量:");
C = scanner.nextFloat();
System.out.println("请输入物品的重量和价值:");
for (int i = 0; i < n; i++) {
weight[i] = scanner.nextFloat();
value[i] = scanner.nextFloat();
// 进行拷贝
v[i] = value[i];
w[i] = weight[i];
}
addBag();
float total = totalValue();
System.out.println("背包的总价值为:" + total);
}
/**
* @see 计算总价值
* @return 返回总价值
*/
public static float totalValue() {
float total = 0;
for (int i = 0; i < n; i++) {
total += add[i] * value[i];
}
return total;
}
/**
* @see 计算物品放入的比例,放入到add数组中
*/
public static void addBag() {
add = new float[n];
// 给重量数组进行排序,重量小的在前面
int index[] = Arraysort(weight);// 对weight进行了排序
for (int i = 0; i < n; i++) {
if (w[index[i]] <= C) {
// 加入背包中
add[index[i]] = 1;
C = C - w[index[i]];
} else {
// 按比例加入背包中
add[index[i]] = C / w[index[i]];
}
}
System.out.print("放入重量比例:");
for (float i : add) {
System.out.print(i + "\t");
}
System.out.println();
System.out.print("单个物品价值:");
for (float i : value) {
System.out.print(i + "\t");
}
System.out.println();
}
/**
* @see 将传进来的数组进行排序,小的在前面
* @param arr
* @return 返回原来数组的下标
*/
public static int[] Arraysort(float[] arr) {
float temp;
int index;
int k = arr.length;
int[] Index = new int[k];
for (int i = 0; i < k; i++) {
Index[i] = i;
}
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
index = Index[j];
Index[j] = Index[j + 1];
Index[j + 1] = index;
}
}
}
return Index;
}
}