动态规划

本文详细介绍了动态规划在01背包和完全背包问题中的应用,包括如何求解背包能装的最大价值和不同装填方法的计数。同时,文章通过LeetCode494题「目标和」进一步解释了动态规划在解决实际问题中的运用,讨论了如何计算给定数组中通过加减操作得到目标和的不同方法数。
摘要由CSDN通过智能技术生成


动态规划

01背包

求背包容量一定时能装的物品的最大值,递推公式为:

for (int i = 0; i < nums.size(); i++) {       //先遍历物品
	for (j = bagweight; j >= nums[i]; j--) {  //再倒序遍历背包容量,因为一个物品不能放入多次
		dp[j] = max(dp[j], dp[j - nums[i]]);
	}
}

求装满背包有几种方法,递推公式为:

for (int i = 0; i < nums.size(); i++) {
	for (j = bagweight; j >= nums[i]; j--) {
		dp[j] += dp[j - nums[i]];
	}
}

完全背包

完全背包中物品可以多次添加,所以从小到大遍历背包容量。

求背包容量一定时能装的物品的最大值,递推公式为:

// 先遍历物品,再遍历背包
for(int i = 0; i < weight.size(); i++) { // 遍历物品
    for(int j = weight[i]; j <= bagWeight ; j++) { // 遍历背包容量
        dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);
    }
}

求装满背包有几种方法,递推公式为:

// 先遍历物品,再遍历背包
// 求组合数是外层遍历物品,内层遍历背包
// 求排列数是外层遍历背包,内层遍历物品
for(int i = 0; i < weight.size(); i++) { // 遍历物品
    for(int j = weight[i]; j <= bagWeight ; j++) { // 遍历背包容量
        dp[j] += dp[j - weight[i]];
    }
}

LeetCode494. 目标和

题目描述:给你一个整数数组 nums 和一个整数 target 。

向数组中的每个整数前添加 ‘+’ 或 ‘-’ ,然后串联起所有整数,可以构造一个 表达式 :

  • 例如,nums = [2, 1] ,可以在 2 之前添加 ‘+’ ,在 1 之前添加 ‘-’ ,然后串联起来得到表达式 “+2-1” 。

返回可以通过上述方法构造的、运算结果等于 target 的不同 表达式 的数目。

链接:https://leetcode-cn.com/problems/target-sum

class Solution {
public:
    int findTargetSumWays(vector<int>& nums, int target) {
        int sum = 0; 
        for (int &x : nums) sum += x;
        if ((target + sum) % 2 == 1) return 0;
        if (abs(target) > sum) return 0;
        int bagweight = (target + sum) / 2;

        vector<int> dp(bagweight + 1, 0);
        dp[0] = 1;
        for (int i = 0; i < nums.size(); i++) {
            for (int j = bagweight; j >= nums[i]; j--) {
                dp[j] += dp[j - nums[i]];
            }
        }
        return dp[bagweight];
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值