LintCode :揹包問題

揹包問題

在n個物品中挑選若干物品裝入揹包,最多能裝多滿?假設揹包的大小爲m,每個物品的大小爲A[i]

您在真實的面試中是否遇到過這個題?
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
感謝您的反饋
樣例

如果有4個物品[2, 3, 5, 7]

如果揹包的大小爲11,可以選擇[2, 3, 5]裝入揹包,最多可以裝滿10的空間。

如果揹包的大小爲12,可以選擇[2, 3, 7]裝入揹包,最多可以裝滿12的空間。

函數需要返回最多能裝滿的空間大小。

注意

你不可以將物品進行切割。

標籤 Expand

相關題目 Expand
解題思路: 
典型的動態規劃
狀態方程爲  sum[ i ][ j ] = max(sum[ i ][ j-1 ],sum[ i -1 ][ j-A[ i ] ]+A[ 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: Given n items with size A[i]
     * @return: The maximum size
     */
    public int backPack(int m, int[] A) {
        // 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] = A[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]]+A[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;
     }
}


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