DAY49
139单词拆分
没有思路。
- 回溯法
回溯怎么做呢:拼接str,看能不能拼出来。注意每个单词能用多次,不是用了就没。
但是语法还是难写。
自己的思路不好,题解思路:枚举所有分割字符串,判断是否在字典集中出现过。
算了别为难自己。
- 动态规划
复习substr函数:
- class Solution {
- public:
- bool wordBreak(string s, vector<string>& wordDict) {
- unordered_set<string> set(wordDict.begin(), wordDict.end());
- vector<bool> dp(s.size() + 1);
- dp[0] = true;
- // 排列数,先背包容量再物品
- for (int i = 1; i <= s.size(); i++) {
- for (int j = 0; j < i; j++) {
- //不算i
- string word = s.substr(j, i - j );
- if (set.find(word) != set.end() && dp[j])
- dp[i] = true;
- }
- }
- return dp[s.size()];
- }
- };
131分割回文串
回溯法的复习。
- class Solution {
- vector<vector<string>> res;
- vector<string>path;
- bool ishuiwen(string s){
- for(int i=0,j=s.size()-1;i<j;i++,j--){
- if(s[i]!=s[j]) return false;
- }
- return true;
- }
- void backtracking(string s,int startindex){
- if(startindex>=s.size()){
- res.push_back(path);
- return ;
- }
- for(int i=startindex;i<s.size();i++){
- string tmpstr=s.substr(startindex,i-startindex+1);
- if(!ishuiwen(tmpstr)) continue;
- path.push_back(tmpstr);
- backtracking(s,i+1);
- path.pop_back();
- }
- }
- public:
- vector<vector<string>> partition(string s) {
- res.clear();
- path.clear();
- backtracking(s,0);
- return res;
- }
- };
多重背包理论基础
卡码网56携带矿石资源
56. 携带矿石资源(第八期模拟笔试)
- Vector push_back:
- #include<iostream>
- #include<vector>
- using namespace std;
- int main(){
- int bagweight,n;
- scanf("%d%d",&bagweight,&n);
- vector<int> weight(n,0);
- vector<int> value(n,0);
- vector<int> nums(n,0);
- for(int i=0;i<n;i++) scanf("%d",&weight[i]);
- for(int i=0;i<n;i++) scanf("%d",&value[i]);
- for(int i=0;i<n;i++) scanf("%d",&nums[i]);
- //unfold:
- for(int i=0;i<n;i++){
- while(nums[i]>1){
- weight.push_back(weight[i]);
- value.push_back(value[i]);
- nums[i]--;
- }
- }
- vector<int> dp(bagweight+1);
- dp[0]=0;
- //01背包问题:
- for(int i=0;i<weight.size();i++){
- for(int j=bagweight;j>=weight[i];j--)
- dp[j]=max(dp[j],dp[j-weight[i]]+value[i]);
- }
- printf("%d",dp[bagweight]);
- return 0;
- }
- 把每种商品的遍历个数放在01背包里面再遍历一遍:
- #include<iostream>
- #include<vector>
- using namespace std;
- int main(){
- int bagweight,n;
- scanf("%d%d",&bagweight,&n);
- vector<int> weight(n,0);
- vector<int> value(n,0);
- vector<int> nums(n,0);
- for(int i=0;i<n;i++) scanf("%d",&weight[i]);
- for(int i=0;i<n;i++) scanf("%d",&value[i]);
- for(int i=0;i<n;i++) scanf("%d",&nums[i]);
- vector<int> dp(bagweight+1);
- dp[0]=0;
- //01背包问题:
- for(int i=0;i<weight.size();i++){
- for(int j=bagweight;j>=weight[i];j--){
- for(int k=1;k<=nums[i]&&(j>=k*weight[i]);k++)
- dp[j]=max(dp[j],dp[j-k*weight[i]]+k*value[i]);
- }
- }
- printf("%d",dp[bagweight]);
- return 0;
- }