class Solution {
public:
int lastStoneWeightII(vector<int>& stones) {
int sum=0;
for(int i=0;i<stones.size();i++)
{
sum+=stones[i];
}
int target=sum/2;
vector<int> dp(target+1,0);
for(int i=0;i<stones.size();i++)
{
for(int j=target;j>=stones[i];j--)
{
dp[j]=max(dp[j],dp[j-stones[i]]+stones[i]);
}
}
return sum-dp[target]-dp[target];
}
};
class Solution {
public:
int findTargetSumWays(vector<int>& nums, int target) {
int sum=0;
for(int i=0;i<nums.size();i++)
{
sum+=nums[i];
}
if((sum+target)%2==1) return 0;
if(abs(target)>sum) return 0;
int ta=(sum+target)/2;
vector<int> dp(2001,0);
dp[0]=1;
for(int i=0;i<nums.size();i++)
{
for(int j=ta;j>=nums[i];j--)
{
dp[j]+=dp[j-nums[i]];
}
}
return dp[ta];
}
};
class Solution {
public:
int findMaxForm(vector<string>& strs, int m, int n) {
vector<vector<int>> res(m+1,vector<int>(n+1,0));
int zero=0;
int one=0;
for(auto str:strs)
{
zero=0;
one=0;
for(int k=0;k<str.size();k++)
{
if(str[k]=='0') zero++;
else one++;
}
for(int i=m;i>=zero;i--)
{
for(int j=n;j>=one;j--)
{
res[i][j]=max(res[i][j],res[i-zero][j-one]+1);
}
}
}
return res[m][n];
}
};