416
01背包的恰好能装满 问题,应该初始化其他全为一个不合法的数,dp[0]=0
相当于价值为1,重量为nums[i]
class Solution {
public:
bool canPartition(vector<int>& nums) {
int sum=0;
int len=nums.size();
sort(nums.begin(),nums.begin()+len);
for(int i=0;i<len;i++){
sum+=nums[i];
}
if(sum%2){
return false;
}
else{
int all=sum/2;
//dfs可做
//dp:01背包的恰好能装满 问题,应该初始化全为一个不合法的数
vector<int> dp(all+1,-10000);
dp[0]=0;
for(int i=0;i<len;i++){
for(int j=all;j>=nums[i];j--){
dp[j]=max(dp[j],1+dp[j-nums[i]]);
}
}
if(dp[all]>0) return true;
return false;
}
}
};
class Solution {
public:
int coinChange(vector<int>& coins, int amount) {
//完全背包恰好装满
vector<int> dp(amount+1,INT_MAX);
dp[0]=0;
int len=coins.size();
for(int i=0;i<len;i++){
for(int j=coins[i];j<=amount;j++){
//dp[j]=min(dp[j],1+dp[j-coins[i]]); 会溢出
if(dp[j]-1>dp[j-coins[i]]){
dp[j]=1+dp[j-coins[i]];
}
}
}
if(dp[amount]==INT_MAX) return -1;
else return dp[amount];
}
};
public:
int findTargetSumWays(vector<int>& nums, int S) {
//恰好装满求方案数 其他赋值为0,dp[0]=1
int sum = 0;
for (int i = 0; i < nums.size(); i++) sum += nums[i];
if (S > sum)
return 0;
if ((S + sum) % 2 == 1)
return 0;
int bagSize = (S + 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];
}
};
该博客探讨了如何使用动态规划解决几种不同的背包问题,包括01背包、完全背包和目标和问题。通过初始化dp数组并迭代更新,找到装满背包的方案或者计算目标和的方案数。代码示例展示了如何在C++中实现这些算法。
8万+

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



