1. 程式人生 > >用貪心演算法解揹包問題時對單位重量物品價值排序Java實現

用貪心演算法解揹包問題時對單位重量物品價值排序Java實現

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; } } } } }