01背包问题:求可承受重量下装载的最大价值
给你一个可装载重量为W
的背包和N
个物品,每个物品有重量和价值两个属性。其中第i
个物品的重量为wt[i]
,价值为val[i]
,现在让你用这个背包装物品,最多能装的价值是多少?
public int maxValue(int W,int N,int[] weight,int[] val){
int[][] dp=new int[N+1][W+1];
for(int i=1;i<=N;i++){
for(int w=1;w<=W;w++){
if(w<weight[i-1]){
//当背包容量装不下时,只能选择不装入背包
dp[i][w]=dp[i-1][w];
}else{
//根据价值选择是否装入背包
dp[i][w]=Math.max(dp[i-1][w-weight[i-1]]+val[i-1],dp[i-1][w]);
}
}
}
return dp[N][W];
}
子集背包问题:求能否使用给定的元素将背包装满
思路:求出数组的总和sum,令sum/2为背包的可承载重量,将元素装入该背包