139. 单词拆分
挺巧妙的一道题,但是我没有时间和心情去总结了。考研成绩出了,我要准备复试内容了。
class Solution {
public:
bool wordBreak(string s, vector<string>& wordDict) {
vector<bool> dp(s.size() + 1, false);
dp[0] = true;
unordered_set<string> uset(wordDict.begin(), wordDict.end());
for (int i = 1; i <= s.size(); i++) {
for (int j = 0; j < i; j++) {
string word = s.substr(j, i - j);
if (uset.find(word) != uset.end() && dp[j] == true) {
dp[i] = true;
}
}
}
return dp[s.size()];
}
};
56. 携带矿石资源(第八期模拟笔试)
题目描述
你是一名宇航员,即将前往一个遥远的行星。在这个行星上,有许多不同类型的矿石资源,每种矿石都有不同的重要性和价值。你需要选择哪些矿石带回地球,但你的宇航舱有一定的容量限制。
给定一个宇航舱,最大容量为 C。现在有 N 种不同类型的矿石,每种矿石有一个重量 w[i],一个价值 v[i],以及最多 k[i] 个可用。不同类型的矿石在地球上的市场价值不同。你需要计算如何在不超过宇航舱容量的情况下,最大化你所能获取的总价值。
输入描述
输入共包括四行,第一行包含两个整数 C 和 N,分别表示宇航舱的容量和矿石的种类数量。
接下来的三行,每行包含 N 个正整数。具体如下:
第二行包含 N 个整数,表示 N 种矿石的重量。
第三行包含 N 个整数,表示 N 种矿石的价格。
第四行包含 N 个整数,表示 N 种矿石的可用数量上限。
输出描述
输出一个整数,代表获取的最大价值。
输入示例
10 3
1 3 4
15 20 30
2 3 2
输出示例
90
提示信息
数据范围:
1 <= C <= 10000;
1 <= N <= 10000;
1 <= w[i], v[i], k[i] <= 10000;
多重背包问题,力扣上没有,可以转化为01背包问题,多加一个循环
#include<iostream>
#include<vector>
using namespace std;
int main() {
int bagWeight,n;
cin>>bagWeight>>n;
vector<int> w(n);
vector<int> v(n);
vector<int> k(n);
for (int i = 0; i < n; i++) {
cin>>w[i];
}
for (int i = 0; i < n; i++) {
cin>>v[i];
}
for (int i = 0; i < n; i++) {
cin>>k[i];
}
vector<int> dp(bagWeight+1, 0);
for (int i = 0; i < n; i++) {
for (int j = bagWeight; j >= w[i]; j--) {
for (int p = 1; p <= k[i] && (j-p*w[i]) >= 0; p++) {
dp[j] = max(dp[j], dp[j-p*w[i]]+p*v[i]);
}
}
}
cout<<dp[bagWeight];
}