动态规划疑惑总结

文章目录


前言

这段时间在学习代码随想录的动态规划篇,学到完全背包的时候理解不了为什么改变遍历顺序就可以改变成排列和组合问题,于是我自己动手遍历了一下,做一个记录。


一、完全背包问题之组合问题---先物体再背包容量(背包)

因为一维和二维思路都是差不多的,为了和下面的排列问题一一对应,这块就直接用一维的进行演示,代码如下:

1.代码

cpp 复制代码
int combinationSum4(vector<int>& nums, int target) {
        int n = nums.size();
        vector<int> dp(target + 1, 0);
        dp[0] = 1;
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j <= target; j++)
            {
                if (j >= nums[i]) dp[j] += dp[j - nums[i]];
                cout << dp[j] << " ";
            }
            cout << endl;
        }
        return dp[target];
    }

2.输出结果如下:

3.现在我们来分析一下这个输出结果:

我们这里默认将新的元素加在集合的最后面,在排列方法中也是这样。

二、完全背包问题之排列问题---先背包再物体

1.代码

cpp 复制代码
int arrangeSum4(vector<int>& nums, int target) {
        int n = nums.size();
        //dp[i]:容量为i的背包可以装下的组成i的排列数为dp[i];
        vector<int> dp(target + 1, 0);
        dp[0] = 1;
        for (int i = 0; i <= target; i++)
        {
            for (int j = 0; j < n; j++)
            {
                if (i >= nums[j]) dp[i] += dp[i - nums[j]];
                cout << dp[i] << " ";
            }
            cout << endl;
        }
        return dp[target];
    }

2.输出结果如下:

3.分析输出结果

上面我们也说了,每次添加的时候会将新加入的元素放在最后面(同意放在最前面也是可以的哈)。

三、对比输出结果

本来我思路是比较乱的,但是当把这两张图画完之后,可以看出来:

对于组合问题,先遍历物体,再遍历背包容量,最后的结果数组的顺序就会按照我们的nums数组的顺序进行排列,在我们的这个例子中,也就是所有的结果数组都是按照从小到大排的,严格按照1, 2, 3的顺序。

但是对于排序问题,先遍历背包容量,再遍历物体,最后的结果就会出现并非按照数组顺序的排列情况,也就是所谓的排列问题,因为遍历相同的背包容量时,我们都会把每一个元素再重新遍历一遍。


总结

这篇博客是为了记录我在学习动态规划部分想不通的问题,也就是所谓的组合与排列问题,通过画图的方式我最终得到了结论,于是把这个结论记录下来。

相关推荐
kebidaixu6 分钟前
两轮BMS 防打火策略详解
算法
wabs66637 分钟前
关于动态规划【力扣1035.不相交的线和53.最大子数组和的思考】
算法·leetcode·动态规划
退休倒计时38 分钟前
【每日一题】LeetCode 199. 二叉树的右视图 TypeScript
算法·leetcode·typescript
可编程芯片开发41 分钟前
通过MATLAB实现PID控制器,积分分离控制器以及滑模控制器
算法
小O的算法实验室1 小时前
2026年ESWA,基于全局进化动态规划与局部粒子群优化GPU 支持去中心化多机器人路径规划
动态规划
kebidaixu1 小时前
两轮BMS 短路保护策略详解
算法
zwenqiyu1 小时前
非线性字符串数据结构串讲
数据结构·c++·学习·算法
z小猫不吃鱼2 小时前
03 Optimal Brain Surgeon 详解:Hessian 剪枝为什么有效?
算法·机器学习·剪枝
硕风和炜2 小时前
【LeetCode: 1301. 最大得分的路径数目 + DP】
java·算法·leetcode·动态规划·dp·记忆化搜索
用户99045017780092 小时前
做了一个AI诊断,参考倪海厦中医理论,科学养生
算法