LeetCode 279完全平方数 139单词拆分 卡码网 56携带矿石资源(多重背包) | 代码随想录25期训练营day45
2023-12-15 08:08:35
动态规划算法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;其他值默认false
vector<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初始化,所有背包在没放物品时默认价值为0
vector<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;
}
文章来源:https://blog.csdn.net/weixin_66706867/article/details/134938142
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!