LintCode背包問題

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

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

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

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

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

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

代碼:

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[] capacitys) {
        if(capacitys == null || capacitys.length <= 0)
            return 0;
        int[] maxCapacity = new int[m + 1];
        for(int i = 0;i < capacitys.length;i++)
        {
            for(int j = m;j >= 1;j--)
            {
                if(j >= capacitys[i])
                {
                    maxCapacity[j] = Math.max(maxCapacity[j - capacitys[i]] + capacitys[i], maxCapacity[j]);
                }
            }
        }
        return maxCapacity[m];
    }
}

二:
給出n個物品的體積A[i]和其價值V[i],將他們裝入一個大小為m的背包,最多能裝入的總價值有多大?

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

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

代碼:

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[] capacitys, int values[]) {
        if(null == capacitys || capacitys.length <= 0 || null == values || values.length <= 0)
            return 0;
        int[] maxValues = new int[m + 1];
        for(int i = 0;i < capacitys.length;i++)
        {
            for(int j = m;j >= 1;j--)
            {
                if(j >= capacitys[i])
                {
                    maxValues[j] = Math.max(maxValues[j - capacitys[i]] + values[i], maxValues[j]);
                }
            }
        }
        return maxValues[m];
    }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容