9大背包第一彈 | 01背包
阿新 • • 發佈:2017-10-11
ref pri method 拷貝 ack string util 行數 image
今天學習01背包。因為01背包在暑假學習過,所以上網看了一下文章,就能寫出來了。主要還是一種動態規劃的思想,設置背包的【容量】進行增長,【物品】進行增長。只要滿足【當前物品】的【價值】=max{
不放入【當前物品】的價值,
從【當前容量】中騰出【當前物品】的【重量】的物品。即丟棄掉掉一些東西,是【當前物品】能放入【當前容量】的背包中。
}
表達能力有限,附上學習鏈接:動態規劃之01背包問題(最易理解的講解)
不過感覺這篇文章的求解矩陣畫的有問題。
我的Java代碼:
1 import java.util.*; 2 3 public class Main {4 5 public static void main(String[] args) { 6 // TODO Auto-generated method stub 7 int []w={2,2,6,5,4}; 8 int []v={6,3,5,4,6}; 9 int weight=10; 10 _01package problem=new _01package(w,v,weight); 11 12 13 } 14 15 } 16 17 class _01package{18 //價值、重量 19 int [][] matrix; 20 List<Integer> solve=new ArrayList<Integer>(); 21 _01package(int [] w,int [] v,int weight){ 22 23 int i,j; 24 int len=w.length; 25 matrix=new int[len+1][weight+1];//構建求解數組 26 for(i=0;i<weight+1;i++) matrix[0][i]=0;//第一行為0 27 for(i=0;i<len+1;i++) matrix[i][0]=0;//第一列為0 28 //動態規劃 29 for(i=1;i<len+1;i++){ //從上到下【不斷將物品放入背包】【i】代表物品 30 for(j=1;j<weight+1;j++){ //從左到右【背包的容量不斷擴充】【j】代表當前容量 31 if(j>w[i-1]){//【當前背包容量】比【將要放入的物品】的【重量】大 32 matrix[i][j]=Math.max 33 (matrix[i-1][j], //選擇不放 34 matrix[i-1][j-w[i-1]]+v[i-1]); //讓背包騰出w[i-1],即【當前物品】的【重量】的空間,選擇放入 35 }else{ //放不進。拷貝【上一個物品】的重量 36 matrix[i][j]=matrix[i-1][j]; 37 } 38 } 39 } 40 System.out.println("求解矩陣:"); 41 System.out.print(this); 42 //回溯 43 j=weight;//最後一列 44 for(i=len;i>0;i--){//對行進行遍歷 45 if(matrix[i][j]>matrix[i-1][j]){//增減物品時,價值增加了。說明放入了物品 46 j-=w[i-1]; 47 solve.add(i); 48 } 49 } 50 System.out.print("應該放入背包的物品:"); 51 for(i=0;i<solve.size();i++) System.out.print(solve.get(i)+" "); 52 System.out.println(); 53 } 54 55 public String toString(){ 56 int row = matrix.length;//行數 57 int col =matrix[0].length;//列數 58 String str=new String(""); 59 int i,j; 60 for(i=0;i<row;i++){ 61 for(j=0;j<col;j++){ 62 str+=Integer.toString(matrix[i][j]); 63 str+="\t"; 64 } 65 str+="\n\n"; 66 } 67 return str; 68 } 69 }
求解矩陣:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 6 6 6 6 6 6 6 0 0 0 6 6 9 9 9 9 9 9 0 0 0 6 6 9 9 9 9 11 11 0 0 0 6 6 9 9 9 10 11 13 0 0 0 6 6 9 9 12 12 15 15
運行結果:
9大背包第一彈 | 01背包