本文主要是介绍LeetCode 279完全平方数 139单词拆分 卡码网 56携带矿石资源(多重背包) | 代码随想录25期训练营day45,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
动态规划算法6
LeetCode 279 完全平方数 2023.12.11
- 题目链接
- 代码随想录讲解[链接]
int numSquares(int n) {//1确定dp数组,其下标表示j的完全平方数的最少数量//3初始化,将dp[0]初始化为0,用于计算,其他值设为INT_MAX用于递推公式求最小vector<int> dp(n+1,INT_MAX);dp[0] = 0;//2确定递推公式,背包j值的最小完全平方数数量=min(背包值j-i*i的最小完全平方数量+1, 之前遍历的dp[j])//因为是求具体值,而非排列数或组合数,所以先遍历背包或者物品均可for (int i = 1; i <= sqrt(n); i++){for(int j = i*i; j <= n; j++){//背包j值的最小完全平方数数量=min(背包值j-i*i的最小完全平方数量+1, 之前遍历的dp[j])dp[j] = min(dp[j-i*i]+1, dp[j]);}}return dp[n];
}
LeetCode 139 单词拆分 2023.12.11
- 题目链接
- 代码随想录讲解[链接]
bool wordBreak(string s, vector<string>& wordDict) {//用于搜索函数搜索某一子串,string类型没有find()函数,与循环体中注释语句配合使用//unordered_set<string> wordSet(wordDict.begin(), wordDict.end());//1确定dp数组及下标含义,dp[i]表示(0,i)子字符串能否被拼接出//3初始化,dp[0]不能为false,否则后续都为false;其他值默认falsevector<bool> dp(s.size()+1, false);dp[0] = true;string cur;//2确定递推公式,4确定遍历顺序//dp[i]表示(0,i)子字符串能否被拼接出,当(j,i)子字符串在字典中且(0,j)子字符串能被拼接出时dp[i]为true//该题为完全背包问题,且具有排列顺序,所以先遍历背包后遍历物品for (int i = 1; i <= s.size(); i++){for(int j = 0; j <= i; j++){//背包容量为i,判断(j,i)与(0,j)是否可拼接cur = s.substr(j, i-j);//if(wordSet.find(cur) != wordSet.end() && dp[j] == true)if(find(wordDict.begin(), wordDict.end(), cur) != wordDict.end() && dp[j] == true)dp[i] = true;}}return dp[s.size()];
}
卡码网 56 携带矿石资源(多重背包) 2023.12.11
- 题目链接
- 代码随想录讲解[链接]
#include<bits/stdc++.h>
using namespace std;int main()
{//背包容量,矿石种类int bagSize, sortSize;cin >> bagSize >>sortSize;//每种矿石的重量、价值、及数量vector<int> weight(sortSize, 0);vector<int> price(sortSize, 0);vector<int> num(sortSize, 0);for(int i = 0; i < sortSize; i++)cin >> weight[i];for(int i = 0; i < sortSize; i++)cin >> price[i]; for(int i = 0; i < sortSize; i++)cin >> num[i];//1确定dp数组及下标含义,这里表示容量为i的背包能装矿石的最大价值//3初始化,所有背包在没放物品时默认价值为0vector<int> dp(bagSize+1, 0);//2确定递推公式,4确定遍历顺序//递推公式中,k表示第i中物品的个数,容量为j的背包最大价值=//max(上次遍历物品的j容量背包最大价值,j-k*weight[i]容量大小的背包的最大价值+k个i物品的价值)for(int i = 0; i < sortSize; i++){for(int j = bagSize; j >= weight[i]; j--){for(int k = 1; k <= num[i] && j >= k*weight[i]; k++){dp[j] = max(dp[j-k*weight[i]] + k*price[i], dp[j]);}}}cout << dp[bagSize] << endl;return 0;
}
这篇关于LeetCode 279完全平方数 139单词拆分 卡码网 56携带矿石资源(多重背包) | 代码随想录25期训练营day45的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!