本题是0-1背包问题,设置dp数组,dp[i]的意义为0-i块石头装入背包的最大重量,最终因为要求最小重量所以背包容量为石头重量总和的1/2,可得递推公式dp[j]=max(dp[j],dp[j- stones[i]]+stones[i])
具体代码如下:
class Solution {
public:
int lastStoneWeightII(vector<int>& stones) {
//dp[i]:容量为i的背包所存放的最大价值
//dp[i]=max(dp[i],dp[i-stones[i]]+stones[i])
vector<int>dp(1501,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];
}
};
本题是0-1背包问题,设置dp数组,dp[i]意义为装满容量为i的背包需要几种方法,可得递推公式dp[j]+=dp[j-nums[i]]。
具体代码如下:
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(abs(target)>sum){return 0;}
if((sum+target)%2==1){return 0;}
vector<int>dp((sum+target)/2+1,0);
dp[0]=1;
for(int i=0;i<nums.size();i++)
{
for(int j=(sum+target)/2;j>=nums[i];j--)
{
dp[j]+=dp[j-nums[i]];
}
}
return dp[(sum+target)/2];
}
};
class Solution {
public:
int findMaxForm(vector<string>& strs, int m, int n) {
vector<vector<int>>dp(m+1,vector<int>(n+1,0));
for(int i=0;i<strs.size();i++)
{
string str=strs[i];
int zeronum=0;
int onenum=0;
for(int j=0;j<str.length();j++)
{
if(str[j]=='0'){zeronum++;}
else{onenum++;}
}
for(int a=m;a>=zeronum;a--)
{
for(int b=n;b>=onenum;b--)
{
dp[a][b]=max(dp[a][b],dp[a-zeronum][b-onenum]+1);
}
}
}
return dp[m][n];
}
};
本文介绍了LeetCode中的三道题目,分别是0-1背包问题的求最大价值、背包中物品组合方式和字符串匹配的最大组合数,通过动态规划的方法实现并提供了相应的代码示例。

被折叠的 条评论
为什么被折叠?



