LintCode : 揹包問題 II



揹包問題 II


給出n個物品的體積A[i]和其價值V[i],將他們裝入一個大小爲m的揹包,最多能裝入的總價值有多大?
您在真實的面試中是否遇到過這個題?
Yes
哪家公司問你的這個題? Airbnb Alibaba Amazon Apple Baidu Bloomberg Cisco Dropbox Ebay Facebook Google Hulu Intel Linkedin Microsoft NetEase Nvidia Oracle Pinterest Snapchat Tencent Twitter Uber Xiaomi Yahoo Yelp Zenefits
感謝您的反饋
樣例

對於物品體積[2, 3, 5, 7]和對應的價值[1, 5, 2, 4], 假設揹包大小爲10的話,最大能夠裝入的價值爲9。

注意

A[i], V[i], n, m均爲整數。你不能將物品進行切分。你所挑選的物品總體積需要小於等於給定的m。

標籤 Expand

相關題目 Expand

解題思路: 
典型的動態規劃,和上一題的揹包問題一致,狀態方程有所修改而已
狀態方程爲  sum[ i ][ j ] = max(sum[ i ][ j-1 ],sum[ i -1 ][ j-A[ i ] ]+V[ i ])
揹包問題的動態規劃算法參考http://blog.csdn.net/dapengbusi/article/details/7463968
public class Solution {
    /**
     * @param m: An integer m denotes the size of a backpack
     * @param A & V: Given n items with size A[i] and value V[i]
     * @return: The maximum value
     */
    public int backPackII(int m, int[] A, int V[]) {
        // write your code here
        if (A == null || 0 == A.length || m == 0)
               return 0;
          int len = A.length;
          int[][]  sum = new int[len][m+1];
          for(int i=0;i<len;i++){
               sum[i][0] = 0;
          }
          for(int j=0;j<m+1;j++){
               if(j>=A[0]){
                    sum[0][j] = V[0];
               }
          }         
          for(int i=1;i<len;i++){
               for(int j=1;j<m+1;j++){
                    if(j>=A[i]){
                         sum[i][j] = max(sum[i-1][j], sum[i-1][j-A[i]]+V[i]);
                    }else{
                         sum[i][j] = sum[i-1][j];
                    }
               }
          }
          return sum[len-1][m];
       
    }
   
    public int max(int a, int b) {
          return a > b ? a : b;
     }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章