动态规划疑惑总结

文章目录


前言

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


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

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

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的顺序。

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


总结

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

相关推荐
搂鱼11451417 分钟前
(二分、思维)洛谷 P4090 USACO17DEC Greedy Gift Takers P 题解
算法
YSRM26 分钟前
Leetcode+Java+图论+岛屿问题
java·算法·leetcode·图论
悠哉悠哉愿意40 分钟前
【数据结构与算法学习笔记】双指针
数据结构·笔记·python·学习·算法
C_lea1 小时前
链表转置算法
算法·链表
未知陨落1 小时前
LeetCode:89.分割等和子集
算法·leetcode
Cx330❀2 小时前
《C++ STL:vector类(下)》:攻克 C++ Vector 的迭代器失效陷阱:从源码层面详解原理与解决方案
开发语言·数据结构·c++·经验分享·算法
bawangtianzun2 小时前
树的重心与直径 性质
数据结构·c++·学习·算法
山猪打不过家猪3 小时前
(一)算法
java·开发语言·算法
乌萨奇也要立志学C++3 小时前
【洛谷】6 道题吃透堆的应用:模板堆、第 k 小、最小函数值等全攻略
算法
合作小小程序员小小店4 小时前
web网页开发,在线%推荐算法学院培养计划,图书推荐,基于Python,FlaskWeb,用户和物品推荐MySql
python·mysql·算法·flask·推荐算法