0-1揹包問題(Java)
阿新 • • 發佈:2019-01-07
文章參考博文:http://blog.csdn.net/mu399/article/details/7722810。從該文章中熟悉了演算法的動態規劃思想,簡單地用Java實現了演算法的思想。
引數:v表示物品的價值,s表示物品的質量,C表示揹包的容量。令M[i,j]表示將物品1-i裝入容量為j的揹包可獲得的最大價值(並不是把1-i都放進去),遞迴式如下:
M(i , j) = Max{ M( i-1, j ) , M( i-1, j-si ) + vi }
Java的實現記錄如下:
void ZeroOnePackage(int []v, int[] s, int C){ int[][] M = new int[v.length][C+1]; int max = 0; for (int i=0; i<v.length; i++){ if(s[i]<=C) for(int j=s[i];j<=C;j++) M[i][j] = v[i]; } for (int i=0; i<v.length; i++){ for(int j=0; j<=C; j++){ if(i>0 && j-s[i]>=0) M[i][j] = Math.max(M[i-1][j],M[i-1][j-s[i]]+v[i] ); if(M[i][j]>max) max = M[i][j]; } } System.out.println("Max ="+ max); }