代码随想录算法训练营第三十八天|动态规划part6(完全背包2)

322. 零钱兑换

题目链接: 322. 零钱兑换 - 力扣(LeetCode)
文章讲解: 代码随想录

思路:

确定递推公式:

dp[j]=min(dp[j],dp[j-coins[i]]+1);

由于是完全背包 ,所以遍历顺序是正序

还存在另一个问题 没有任何一种硬币组合能组成总金额

其实也就是没更新 dp

cpp 复制代码
class Solution {
public:
    int coinChange(vector<int>& coins, int amount) {
        vector<double>dp2(amount+1,0);
        dp2[0]=0;
        for(int i=0;i<coins.size();i++){
            for(int j=coins[i];j<=amount;j++){
                dp2[j]=max(dp2[j],dp2[j-coins[i]]+coins[i]);
            }
        }
        if(dp2[amount]!=amount)
        return -1;
        
        vector<int>dp(amount+1,INT_MAX-2);
        dp[0]=0;
        for(int i=0;i<coins.size();i++){
            for(int j=coins[i];j<=amount;j++){
                dp[j]=min(dp[j],dp[j-coins[i]]+1);
            }
        }
        return dp[amount];
    }
};

需要注意的是:完全背包的两层for循环强调先后顺序

但是排列 或组合问题是强调先后顺序的

279.完全平方数

题目链接:279. 完全平方数 - 力扣(LeetCode)

文章讲解:代码随想录

思路:

这道题跟上题几乎一样

cpp 复制代码
class Solution {
public:
    int numSquares(int n) {
        vector<int>nums;
        for(int i=1;i<=sqrt(n);i++){
            nums.push_back(i*i);
        }
        vector<int>dp(n+1,INT_MAX);
        dp[0]=0;
        for(int i=0;i<nums.size();i++){
            for(int j=nums[i];j<=n;j++){
                dp[j]=min(dp[j],dp[j-nums[i]]+1);
            }
        }
        return dp[n];
        
    }
};

139.单词拆分

题目链接:139. 单词拆分 - 力扣(LeetCode)

文章讲解:代码随想录

思路:

这道题可以理解为一个完全背包问题

那么需要考虑 背包容量 物品

物品就是单词

背包容量呢 就是字符串s的长度

完全背包 那么是排列问题还是组合问题 这是排列问题 所以先遍历背包

dp[i]表示前i个字符能被分割

字符串有函数s.substr(i,n)表示从位置i开始分割长度为n的字符串

注意递推公式:

cpp 复制代码
class Solution {
public:
    bool wordBreak(string s, vector<string>& wordDict) {
       unordered_set<string>myset(wordDict.begin(),wordDict.end());
       vector<bool>dp(s.size()+1,false);
       dp[0]=true;
       for(int i=1;i<dp.size();i++){   
        for(int j=0;j<i;j++){
            string word=s.substr(j,i-j);
            if(myset.find(word)!=myset.end()&&dp[j]==true) {dp[i]=true;}
        }
       }
       return dp[s.size()];
    }
};
相关推荐
深栈32 分钟前
机器学习:支持向量机
算法·机器学习·支持向量机
刘海东刘海东42 分钟前
结构型智能科技理论研究(草稿)
科技·算法
C嘎嘎嵌入式开发1 小时前
(10)100天python从入门到拿捏《Python中的数据结构与自定义数据结构》
数据结构·python·算法
熬了夜的程序员1 小时前
【LeetCode】69. x 的平方根
开发语言·算法·leetcode·职场和发展·动态规划
Niuguangshuo1 小时前
音频特征提取算法介绍
算法·音视频
fengfuyao9851 小时前
基于MATLAB的匈牙利算法实现任务分配
算法·数学建模·matlab
CoovallyAIHub1 小时前
超详细链式插补 (MICE) 多元插补:机器学习模型的高级缺失数据处理
算法·机器学习·计算机视觉
明天会有多晴朗2 小时前
C语言入门教程(第6讲):函数——让程序学会“分工合作”的魔法
c语言·开发语言·算法
玖釉-2 小时前
三维模型数据结构与存储方式解析
数据结构·算法·图形渲染
草莓熊Lotso2 小时前
《算法闯关指南:优选算法--二分查找》--17.二分查找(附二分查找算法简介),18. 在排序数组中查找元素的第一个和最后一个位置
开发语言·c++·算法