一:
在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];
}
}