1. 题目描述(01背包问题)
给定一个正整数数组 nums
和一个整数 target
。
向数组中的每个整数前添加 '+'
或 '-'
,然后串联起所有整数,可以构造一个 表达式 :
- 例如,
nums = [2, 1]
,可以在2
之前添加'+'
,在1
之前添加'-'
,然后串联起来得到表达式"+2-1"
。
返回可以通过上述方法构造的、运算结果等于 target
的不同 表达式 的数目。
示例 1:
输入:nums = [1,1,1,1,1], target = 3 输出:5 解释:一共有 5 种方法让最终目标和为 3 。 -1 + 1 + 1 + 1 + 1 = 3 +1 - 1 + 1 + 1 + 1 = 3 +1 + 1 - 1 + 1 + 1 = 3 +1 + 1 + 1 - 1 + 1 = 3 +1 + 1 + 1 + 1 - 1 = 3
示例 2:
输入:nums = [1], target = 1 输出:1
提示:
1 <= nums.length <= 20
0 <= nums[i] <= 1000
0 <= sum(nums[i]) <= 1000
-1000 <= target <= 1000
2.动态规划套路
2.1 要明确两点,“状态”和“选择”。
状态有两个,“背包的容量”和“可选择的物品”;选择就是“装进背包”或者“不装进背包”。
2.2 要明确dp数组的定义。
2.3 根据“选择”,思考状态转移的逻辑。
2.4 把伪码翻译成代码,处理一些边界情况。
△基本明确了dp数组的定义,就可以确定状态转移了。
3. 01背包问题
该问题描述如下:给一个可装载重量为W的背包和N个物品,每个物品有重量和价值两个属性。其中第i个物品的重量为wt[i],价值为val[i],现在让你用这个背包装物品,最多能装的价值是多少?
以下是Python代码实现:
N=3, W=4
wt=[2, 1, 3]
val=[4, 2, 3]
算法返回6,选择前两件物品装进背包,总重量3小于W,可以获得最大价值6。
4. 代码实现c++(动态规划)
int sum=0;
for(int i=0;i<nums.size();i++){
sum+=nums[i];
}
if(abs(target)>sum) return 0;
if((target+sum)%2==1) return 0;
int bagsize=(target+sum)/2;
vector<int> dp(bagsize+1, 0);
//01背包问题
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];
https://leetcode.cn/problems/YaVDxD/description/ --目标和的链接
感谢您的阅读与参与,您的支持是我前进的动力。持续学习是我们迈向梦想彼岸的主要途径,加油吧,读者们!!!