背包问题
0-1背包问题解决方式(二维数组)
0-1背包示例代码
public static void func1(int[] weight, int[] value, int bagSize){
//初始化dp数组
int goods = weight.length;
int[][] dp = new int[goods][bagSize+1];
for (int i = weight[0]; i <=bagSize; i++) {
dp[0][i] = value[0];
}
for(int i = 1;i<goods;i++){
for (int j = 1; j <= bagSize; j++) {
if(j<weight[i]){
dp[i][j] = dp[i-1][j];
}else{
dp[i][j] = Math.max(dp[i-1][j],value[i]+dp[i-1][j-weight[i]]);
}
}
}
for (int i = 0; i < goods; i++) {
for (int j = 0; j <=bagSize; j++) {
System.out.print(dp[i][j]+" ");
}
System.out.println();
}
}
//main方法中代码
int[] value = {15,20,30};
int[] weight = {1,3,4};
int bagSize = 4;
func1(weight,value,bagSize);
0-1背包问题解决方式(一维数组)
示例代码
public static void func2(int[] weight, int[] value, int bagWeight) {
int wLen = weight.length;
//定义dp数组:dp[j]表示背包容量为j时,能获得的最大价值
int[] dp = new int[bagWeight + 1];
//遍历顺序:先遍历物品,再遍历背包容量
for (int i = 0; i < wLen; i++) {
for (int j = bagWeight; j >= weight[i]; j--) {
dp[j] = Math.max(dp[j], dp[j - weight[i]] + value[i]);
}
}
//打印dp数组
for (int j = 0; j <= bagWeight; j++) {
System.out.print(dp[j] + " ");
}
}
}
LeetCode T416 等和子集问题
题目链接:416. 分割等和子集 - 力扣(LeetCode)
题目思路:
题目代码:
class Solution {
public boolean canPartition(int[] nums) {
if(nums.length == 1){
return false;
}
int sum = 0;
for(int i:nums){
sum += i;
}
if(sum % 2 == 1){
return false;
}
int bagSize = sum/2;
int[] dp = new int[bagSize+1];
//初始化均为0
for(int i = 0;i<nums.length;i++){
for(int j = bagSize;j>=nums[i];j--){
dp[j] = Math.max(dp[j],dp[j-nums[i]]+nums[i]);
}
}
if(dp[bagSize] == bagSize){
return true;
}
return false;
}
}