416.分割等和子集
题目链接:416.分割等和子集
题目描述:
给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。
解题思路:
本题是典型的01背包问题,物品是数字,背包容量是所有数字总和的一半。
采用一维数组的方式
动态规划五部曲:
- 确定dp及其下标含义:dp[i]表示背包容量为j的背包,所背物品的最大价值
- 递归关系式:dp[j]=max(dp[j],dp[j-nums[i]]+nums[i]);
- 初始化:都是0;
- 遍历顺序,先遍历物品,在遍历背包(从大容量往小容量)
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!=0) return false;
int target=sum/2;
vector<int>dp(target+1,0);
for(int i=0;i<nums.size();i++)
{
for(int j=target;j>=nums[i];j--)
{
dp[j]=max(dp[j],dp[j-nums[i]]+nums[i]);
}
}
if(dp[target]==target) return true;
return false;
}
};