(2021复旦机试)目标和+背包问题模板

目标和(LeetCode经典背包问题)

背包分类的模板:
  1. 0/1背包:外循环nums,内循环target,target倒序且target>=nums[i];
  2. 完全背包:外循环nums,内循环target,target正序且target>=nums[i];
  3. 分组背包:这个比较特殊,需要三重循环:外循环背包bags,内部两层循环根据题目的要求转化为1,2,3三种背包类型的模板
问题分类的模板:
  1. 最值问题: dp[i] = max/min(dp[i], dp[i-nums]+1)或dp[i] = max/min(dp[i], dp[i-num]+nums);
  2. 存在问题(bool):dp[i]=dp[i]||dp[i-num];
  3. 组合问题:dp[i]+=dp[i-num];------二维情况: dp[i][j] = dp[i-1][j] + dp[i][j - nums[i-1]]
  4. 参考文章

关键点:dp数组含义、边界条件设计、转移方程设计、背包容量的变通设计

alt

方法一:递归法

class Solution {
public:
    void countWays(vector<int> nums,int sums, int index,int target,int& count){
        if(index == nums.size()) {
            if(sums == target) {
                count++;
            }
            return;
        }
        countWays(nums,sums+nums[index],index+1,target,count);
        countWays(nums,sums-nums[index],index+1,target,count);
    }
    int findTargetSumWays(vector<int>& nums, int target) {
        int count=0;
        countWays(nums,0,0,target,count);
        return count;
    }
};

方法二:动态规划法

alt

其中neg即为背包的最大容量,即要找的最的解决方案,dp[n][neg]即为具体的方案数,定义package = neg;

  • dp[i][j]定义:以nums[i]为结尾的元素的和为j的方案的个数
  • 边界条件:dp[0][0]=1 背包容量是0,选择的数字也是0个,一共有1种方案,另外dp[0][i] =0 ,i∈[0, package]无论背包容量多大,背包中能放入的物品只有0个数字,因此方案只有0个。
  • 转移方程: alt
public:
    int findTargetSumWays(vector<int>& nums, int target) {
        int sum = 0;
        for(auto x : nums) sum += x;
        int diff = sum - target;
        if(diff % 2 != 0 || diff < 0) {
            return 0;
        }
        int package = diff / 2;
        int n = nums.size();
        vector<vector<int>> dp(n+1, vector<int>(package + 1, 0 ));
        //1.边界条件处理
        dp[0][0] = 1;//  另外dp[0][i] i∈[0, package]
        //2. dp主过程
        for(int i=1;i<=n;i++) {
            for(int j=0;j<=package;j++) {
                int curNum = nums[i-1];
                if(curNum <= j) {//当前数字可以放入背包的场景,可以选择放入,也可选择不放入对应的放法都需要被考虑,所以需要相加
                    dp[i][j] = dp[i-1][j] + dp[i-1][j - curNum]; 
                }else{ //   当前数字无法放入,那么j的放入方案就只有dp[i-1][j]种
                    dp[i][j] = dp[i-1][j];
                }
            }
        }
        return dp[n][package];
    }
};
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
正在热议
更多
# 春招至今,你的战绩如何? #
11367次浏览 96人参与
# 你的实习产出是真实的还是包装的? #
2012次浏览 42人参与
# 米连集团26产品管培生项目 #
6102次浏览 216人参与
# 军工所铁饭碗 vs 互联网高薪资,你会选谁 #
7684次浏览 43人参与
# 简历第一个项目做什么 #
31788次浏览 343人参与
# 重来一次,我还会选择这个专业吗 #
433634次浏览 3926人参与
# 巨人网络春招 #
11386次浏览 223人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
187253次浏览 1122人参与
# 牛客AI文生图 #
21456次浏览 238人参与
# 不考虑薪资和职业,你最想做什么工作呢? #
152506次浏览 888人参与
# 研究所笔面经互助 #
118983次浏览 577人参与
# 简历中的项目经历要怎么写? #
310452次浏览 4223人参与
# AI时代,哪些岗位最容易被淘汰 #
63971次浏览 832人参与
# 面试紧张时你会有什么表现? #
30527次浏览 188人参与
# 你今年的平均薪资是多少? #
213187次浏览 1039人参与
# 你怎么看待AI面试 #
180244次浏览 1261人参与
# 高学历就一定能找到好工作吗? #
64345次浏览 620人参与
# 你最满意的offer薪资是哪家公司? #
76600次浏览 374人参与
# 我的求职精神状态 #
448210次浏览 3129人参与
# 正在春招的你,也参与了去年秋招吗? #
363606次浏览 2638人参与
# 腾讯音乐求职进展汇总 #
160707次浏览 1112人参与
# 校招笔试 #
471441次浏览 2964人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务