用貪心演算法解揹包問題時對單位重量物品價值排序Java實現
阿新 • • 發佈:2019-01-09
package n18_揹包問題貪心演算法;
/*
* 用貪心演算法解揹包問題
*/
public class Main {
public static void main(String[] args) {
// 單位重量價值分別為:10 5 7 6 3 8 90 100
double w[] = { 0, 50, 80, 30, 40, 20, 60, 10 ,1};//物體的重量
double v[] = { 0, 500, 400, 210, 240, 60, 480, 900,100 };//物體的價值
double M = 170;// 揹包所能容納的重量
int n = w.length - 1;// 物體的個數
double[] x = new double[n + 1];// 每個物體裝進的比例,大於等於0並且小於等於1
f(w, v, M, n, x);//呼叫貪心演算法函式
System.out.println("排序後的物體的重量:");
for(int i=1;i<=n;i++){
System.out.print(w[i]+"\t");
}
System.out.println();
System.out.println("排序後的物體的價值:" );
for(int i=1;i<=n;i++){
System.out.print(v[i]+"\t");
}
double[]t=new double[n+1];//定義一個數組表示單位重量物體的價值
for(int i=1;i<=n;i++){
t[i]=v[i]/w[i];
}
//用氣泡排序對double[]t進行排序(大的在前)
for(int i=1;i<=n;i++){
for(int j=1 ;j<=n-i;j++){
if(t[j]<t[j+1]){
double temp=t[j];
t[j]=t[j+1];
t[j+1]=temp;
}
}
}
System.out.println();
System.out.println("排好序後的單位物體的價值: ");
for(int i=1;i<=n;i++){
System.out.print(t[i]+"\t");
}
double maxValueSum=0; //用來存放揹包能裝下的物體的最大價值總和
for(int i=1;i<x.length;i++){
maxValueSum+=x[i]*v[i];
}
System.out.println();
System.out.println("排序後每個物體裝進揹包的比例:");
for(int i=1;i<=n;i++){
System.out.print(x[i]+"\t");
}
System.out.println();
System.out.println("揹包能裝下的物體的最大價值總和為: "+maxValueSum);
}
/**
*
* @param w 物體的重量
* @param v 物體的價值
* @param M 揹包的容量
* @param n 物體的個數
* @param x 每個物體裝進揹包的比例,取值0<=x[i]<=1,(1<=i<=n)
*/
private static void f(double[] w, double[] v, double M, int n, double[] x) {
sort(w, v, n);// 首先按照物體的單位重量的價值進行排序,單位重量價值大的排在前面
double c = M; //揹包剩餘的容量,剛開始時還沒用裝東西,為M
int i;//表示第幾五物體
for (i = 1; i <= n; i++) {
if (w[i] <= c){//如果揹包剩餘的容量大於等於第i個物體的重量
x[i] = 1; //把第i個物體整個裝進揹包
c -= w[i]; //揹包的剩餘容量減少了第i個物體的重量
}else {
break; //退出迴圈
}
}
if (i <= n){//判斷是否第n個物體整個裝進去揹包裡了,如果i<=n表示否定
x[i] = c / w[i];
}
}
/*
* 可以按氣泡排序來寫,先計算W中每個物體單位價值存成一個數組,然後氣泡排序,
* 若有元素交換,對應W中相同標號的元素也交換就可以了
*/
private static void sort(double[] w, double[] v, int n) {
double []t=new double[n+1];
for(int i=1;i<=n;i++){
t[i]=v[i]/w[i];
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n-i;j++){
if(t[j]<t[j+1]){
double temp=t[j];
t[j]=t[j+1];
t[j+1]=temp;
double temp2=w[j];
w[j]=w[j+1];
w[j+1]=temp2;
double temp3=v[j];
v[j]=v[j+1];
v[j+1]=temp3;
}
}
}
}
}