1049. 最后一块石头的重量 II
class Solution {
public:
int lastStoneWeightII(vector<int>& stones)
{
vector<int>dp(15001,0);
int sum=0;
for(int i=0;i<stones.size();i++)
sum+=stones[i];
int target=sum/2;
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];
// int sum=0;
// for(int i=0;i<stones.size();i++)
// sum+=stones[i];
// vector<int>dp(15001,0);
// int target=sum/2;
// 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];
}
};
494. 目标和
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((target+sum)%2==1)
return 0;
int bagsize=(target+sum)/2;
vector<int>dp(bagsize+1,0);
dp[0]=1;
for(int i=0;i<nums.size();i++)
{
for(int j=bagsize;j>=nums[i];j--)
{
dp[j]+=dp[j-nums[i]];
}
}
return dp[bagsize];
// int sum = 0;
// for (int& num : nums) {
// sum += num;
// }
// int diff = sum - target;
// if (diff < 0 || diff % 2 != 0) {
// return 0;
// }
// int neg = diff / 2;
// vector<int> dp(neg + 1);
// dp[0] = 1;
// for (int& num : nums) {
// for (int j = neg; j >= num; j--) {
// dp[j] += dp[j - num];
// }
// }
// return dp[neg];
}
};
474.一和零
class Solution {
public:
int findMaxForm(vector<string>& strs, int m, int n)
{
vector<vector<int>>dp(m+1,vector<int>(n+1,0));
for(string str:strs)
{
int one=0,zero=0;
for(char c:str)
{
if(c=='0')
zero++;
else
one++;
}
for(int i=m;i>=zero;i--)
{
for(int j=n;j>=one;j--)
{
dp[i][j]=max(dp[i][j],dp[i-zero][j-one]+1);
}
}
}
return dp[m][n];
}
};