01背包问题
dp[i][j] 把0-i件物品放入j容量的背包中的最大价值
递推公式:
不放物品i dp[i-1][j]
放物品i dp[i-1][j-weight[i]] + value[i]
遍历顺序
先背包后物品或者先物品后背包都可以
一维滚动数组:
dp[j] 容量为j的背包能放的最大价值
dp[j]= max(dp[j] , dp[j - weight[i] + value[i] )
先物品后背包,倒叙遍历背包
416. 分割等和子集
题目:力扣
class Solution {
public:
bool canPartition(vector<int>& nums) {
int sum = 0;
for(int i = 0; i < nums.size(); ++i){
sum += nums[i];
}
if(sum % 2 == 1) return false;
int ans = sum / 2;
vector<int> dp(ans+1,0);
for(int i = 0; i < nums.size(); ++i){
for(int j = ans; j >= nums[i]; --j){
dp[j] = max(dp[j],dp[j - nums[i]] + nums[i]);
}
}
if(dp[ans] == ans) return true;
else return false;
}
};
总结
题型:0/1背包