已知道n種物品和一個可容納c重量的揹包,第i種物品的重量爲wi,價值爲pi,裝包的時候能夠把物品拆開(便可只裝每種物品的一部分),設計如何裝包,使裝包所得總體的價值最高?java
首先,咱們要知道,n種物品以及他們對應的價值,都是由用戶輸入的算法
咱們使用貪心算法,每一步取最大效益的物品放入揹包之中(及單位價值爲最高的物品 單位價值=pi/wi)數組
由以上思路,咱們能夠定義一個二維數組來接收用戶輸入的數值this
w[i][0] 表明了第i種物品的重量(即wi)
設計
w[i][1] 表明了第i種物品的價值(即pi)
code
w[n][m] n範圍爲1~n m範圍爲0~1orm
這裏須要注意,數組下標是從0開始的,咱們的n是從1開始的,空出了一個0,因此咱們定義n應該定義爲n+1 這裏應該不難理解,n+1的話,下標就是0~n,咱們須要1~n這n個位置blog
定義爲double[][] w = new double[n+1][2]
排序
除了上面所說,咱們還需一個Flag類
來存放單位價值以及該單位價值對應的第i個物品(也就是下標)ci
咱們將單位價值計算得出後做爲Flag類
的成員變量content
,以及下標做爲Flag類
中的成員變量flag
,以後使用ArrayList
存放多個Flag類
以後,將單位價值存放在一個一維數組中,使用排序,從小到大排序
獲得排序以後的一維數組,依次與ArrayList
中的每個Flag類
的content
做比較,獲得其對應的下標,存入到棧中
以後,棧頂就是單位價值最大的所對應的下標,依次取出來(即實現了每次都是取到的物品都是單位價值最大的),進行相關的運算便可
Scanner scanner = new Scanner(System.in); double cost = 0;//記錄當揹包滿的時候所達到的價值 System.out.println("輸入物品個數n:"); int n = scanner.nextInt(); System.out.println("輸入揹包可裝容量c:"); double c = scanner.nextDouble(); double temp[] = new double[n+1]; double w[][] = new double[n+1][2]; ArrayList<Flag> list = new ArrayList<Main.Flag>(); for(int i=1;i<=n;i++){ System.out.println("w"+i+"重量:"); w[i][0] = scanner.nextDouble(); System.out.println("w"+i+"價值:"); w[i][1] = scanner.nextDouble(); temp[i]=w[i][1]/w[i][0]; } scanner.close(); Stack<Integer> stack = new Stack<Integer>(); //存入到list中,保存原來的下標和內容 for(int i=1;i<temp.length;i++){ Flag flag = new Flag(i, temp[i]); list.add(flag); } double t = 0; Arrays.sort(temp);//使用java中自帶的快速排序 //將原來的下標存入進棧中,處於棧頂的是單位價值最高的該物品的下標 for(int i=1;i<temp.length;i++){ for(Flag flag : list){ if(flag.getContent()==temp[i]){ stack.push(flag.getFlag()); } } } while(!stack.isEmpty()){ int i =stack.pop();//出棧 c = c -w[i][0]; if(c<=0){ c = c+w[i][0];//加回以前所減去的內容,計算百分比 double a = (c/w[i][0])*100; DecimalFormat format = new DecimalFormat("##.#"); System.out.println("裝入"+"第"+i+"種物品的百分之"+format.format(a)+",重量爲"+w[i][0]+",價值爲"+w[i][1]); cost = cost+w[i][1]*(a/100); System.out.println("最大價值爲"+format.format(cost)); break; }else{ cost = cost+w[i][1]; } System.out.println("裝入"+"第"+i+"種物品"+",重量爲"+w[i][0]+",價值爲"+w[i][1]); } } //定義了一個Flag類,存放原來的座標以及單位價值 public static class Flag{ int flag; double content; public Flag(int flag,double content){ this.flag = flag; this.content= content; } public int getFlag(){ return this.flag; } public double getContent(){ return this.content; } }