动态规划
416.分割等和子集
动态规划:
- 定义dp数组含义: dp[j]代表背包容量为j时的背包能装的最大价值
- 滚动数组, 升序遍历物品, 降序遍历背包
代码:
class Solution {
public boolean canPartition(int[] nums) {
// 本质是01背包问题
// 偶数 + 偶数 == 偶数
int n = nums.length;
int sum = Arrays.stream(nums).sum();
if(sum % 2 != 0) return false;
// 找到一些数字使得其和等于 sum / 2
int bagSize = sum >> 1;
int[] dp = new int[bagSize + 1];
for(int i=0; i<n; i++) {
for(int j=bagSize; j>=nums[i]; j--){
dp[j] = Math.max(dp[j], dp[j-nums[i]] + nums[i]);
}
}
return dp[bagSize] == bagSize;
}
}