当前位置: 首页 > news >正文

数据结构-算法C++(额外问题汇总)

目录

  • 线性动态规划---背包问题
    • 1. 0-1背包
    • 2.完全背包
    • 3.多重背包
      • 法一:
      • 法二:二进制优化
      • 法三:单调队列优化
      • 复杂度对比
    • 4.混合背包
    • 额外资料
  • 区间动态规划

线性动态规划—背包问题

1. 0-1背包

在这里插入图片描述
洛谷题目链接

#include <bits/stdc++.h>
using namespace std;int T,M;
vector<int> times;
vector<int> value;int main(){cin>>T>>M;times.push_back(0);value.push_back(0);for(int i=0;i<M;i++){int t,v;cin>>t>>v;times.push_back(t);value.push_back(v);}vector<vector<int>>dp(M+1,vector<int>(T+1));//法一for(int i=1;i<M+1;i++){for(int j=1;j<=T;j++){if(times[i]<=j){dp[i][j]=max(dp[i-1][j],dp[i-1][j-times[i]]+value[i]);}else{dp[i][j]=dp[i-1][j];}}}cout<<dp[M][T]<<endl;return 0;}

在这里插入图片描述
在这里插入图片描述

    vector<int>dp(T+1);//法二for(int i=1;i<M+1;i++){for(int j=T;j>=0;j--){dp[j]=max(dp[j],dp[j-times[i]]+value[i]);    }}

2.完全背包

在这里插入图片描述
题目链接

#include <bits/stdc++.h>
using namespace std;int T,M;
vector<int> times;
vector<int> value;int main(){cin>>T>>M;times.push_back(0);value.push_back(0);for(int i=0;i<M;i++){int t,v;cin>>t>>v;times.push_back(t);value.push_back(v);}vector<long long>dp(T+1);for(int i=1;i<M+1;i++){for(int j=1;j<=T;j++){if(times[i]<=j){dp[j]=max(dp[j],dp[j-times[i]]+value[i]);}}}cout<<dp[T]<<endl;return 0;}

在这里插入图片描述
在这里插入图片描述

3.多重背包

在这里插入图片描述
题目链接

在这里插入图片描述
在这里插入图片描述

法一:

#include <bits/stdc++.h>
using namespace std;int n,W;
vector<int> weight;
vector<int> value;
vector<int> counts;int main(){cin>>n>>W;weight.push_back(0);value.push_back(0);counts.push_back(0);for(int i=0;i<n;i++){int v,w,m;cin>>v>>w>>m;value.push_back(v);weight.push_back(w);counts.push_back(m);}vector<int>dp(W+1);for(int i=1;i<n+1;i++){for(int j=W;j>=0;j--){for(int k=0;k<=counts[i]&&j>=k*weight[i];k++){//if(j>=k*weight[i])dp[j]=max(dp[j],dp[j-k*weight[i]]+k*value[i]);}}}cout<<dp[W];return 0;}

在这里插入图片描述

法二:二进制优化

#include <bits/stdc++.h>
using namespace std;int n,W;
vector<int> weight;
vector<int> value;
int main(){cin>>n>>W;weight.push_back(0);value.push_back(0);for(int i=0;i<n;i++){int v,w,m;cin>>v>>w>>m;int tem=1;while(tem<=m){weight.push_back(tem*w);value.push_back(tem*v);m-=tem;tem <<=1;       }weight.push_back(m*w);value.push_back(m*v);}vector<int>dp(W+1);for(int i=1;i<=weight.size();i++){for(int j=W;j>=0&&j>=weight[i];j--){dp[j]=max(dp[j],dp[j-weight[i]]+value[i]);}}cout<<dp[W];return 0;
}

法三:单调队列优化

背包问题汇总

复杂度对比

方法时间复杂度空间复杂度适用场景
朴素多重背包O(N × W × M)O(W)数据量小
二进制优化O(N log M × W)O(W + N log M)中等数据量
单调队列优化O(N × W)O(W)大数据量

4.混合背包

在这里插入图片描述

法一:分类处理

#include <bits/stdc++.h>
using namespace std;// 物品结构体
struct Item {int T; // 耗时int C; // 价值
};int main() {// --- 1. 输入和时间计算 ---string Ts, Te;int n;cin >> Ts >> Te >> n;int sz1 = Ts.find(':'), sz2 = Te.find(':');int t1 = stoi(Ts.substr(0, sz1)) * 60 + stoi(Ts.substr(sz1 + 1));int t2 = stoi(Te.substr(0, sz2)) * 60 + stoi(Te.substr(sz2 + 1));int maxT = t2 - t1;// --- 2. 物品分类收集 ---vector<Item> zero_one_items;    // 存放01背包和拆分后的多重背包物品vector<Item> complete_items;    // 存放完全背包物品for (int i = 0; i < n; i++) {int t, c, p;cin >> t >> c >> p;if (p == 0) {// 完全背包物品,直接存入complete_items.push_back({t, c});} else {// 01背包 (p=1) 和 多重背包 (p>1) 都走这里int k = 1;while (k <= p) {// 二进制拆分zero_one_items.push_back({t * k, c * k});p -= k;k <<= 1; // 等同于 k *= 2}if (p > 0) {// 处理剩余部分zero_one_items.push_back({t * p, c * p});}}}// --- 3. DP计算 ---vector<int> dp(maxT + 1, 0);// 步骤 A: 处理所有01背包和拆分后的多重背包物品// 它们都使用逆序循环,可以放在一起处理for (const auto& item : zero_one_items) {for (int j = maxT; j >= item.T; j--) {dp[j] = max(dp[j], dp[j - item.T] + item.C);}}// 步骤 B: 处理所有完全背包物品// 必须使用正序循环for (const auto& item : complete_items) {for (int j = item.T; j <= maxT; j++) {dp[j] = max(dp[j], dp[j - item.T] + item.C);}}// --- 4. 输出结果 ---cout << dp[maxT] << endl;return 0;
}

法二:统一为0-1背包问题

#include <bits/stdc++.h>
using namespace std;int dp[1005];
int Ci[100005],Ti[100005];
int cnt=1;
int main(){string Ts,Te;int n;cin>>Ts>>Te>>n;int maxT;int sz1=Ts.find(':');int sz2=Te.find(':');int t1=stoi(Ts.substr(0,sz1))*60+stoi(Ts.substr(sz1+1));int t2=stoi(Te.substr(0,sz2))*60+stoi(Te.substr(sz2+1));maxT=t2-t1;for(int i=0;i<n;i++){int a,b,c;cin>>a>>b>>c;if(c==0){c=maxT;}c=min(c,maxT);int tem=1; while(tem<c){Ci[cnt]=tem*b;Ti[cnt]=tem*a;cnt++;c-=tem;tem <<=1;       }Ci[cnt]=c*b;Ti[cnt]=c*a;cnt++;}for(int i=1;i<=cnt;i++){for(int j=maxT;j>=0&&Ti[i]<=j;j--){dp[j]=max(dp[j],dp[j-Ti[i]]+Ci[i]);}}cout<<dp[maxT];return 0;}

额外资料

背包问题汇总

区间动态规划

在这里插入图片描述
问题链接

#include <bits/stdc++.h>
using namespace std;int st[305];
int presum[305];
int main(){int N;cin>>N;for(int i=1;i<=N;i++){cin>>st[i];presum[i]=presum[i-1]+st[i];}int dp[305][305];for(int i=1;i<=N;i++){for(int j=i+1;j<=N;j++){dp[i][j]=INT_MAX;}}for(int len=1;len<N;len++){for(int l=1;l<=N-len;l++){int r=l+len;for(int k=l;k<=r-1;k++){dp[l][r]=min(dp[l][r],dp[l][k]+dp[k+1][r]+presum[r]-presum[l-1]);}    }    }cout<<dp[1][N]<<endl;return 0;
}
http://www.dtcms.com/a/454418.html

相关文章:

  • 广州制作外贸网站邯郸wap网站建设公司
  • 在 Ubuntu22.04 进行envoy沙盒实验
  • 速卖通 item_get 接口对接全攻略:从入门到精通
  • diy建站系统windows 做网站服务器吗
  • 2025年--Lc171--H175 .组合两个表(SQL)
  • 贪心算法 | 每周8题(二)
  • 杭州知名的企业网站建设策划连云港吧
  • 建设工程网站有哪些黄骅贴吧最近发生的事
  • 广西网站建设招标公司如何用网站做招聘
  • 网络引流怎么做啊?百度关键词seo排名优化
  • 【开题答辩全过程】以 爱学习教育网站为例,包含答辩的问题和答案
  • 做旅游攻略去什么网站好广告设计与制作短期培训班
  • 搭建个人博客网站找国内外贸公司的网站
  • Halcon---3D知识点总结(待整理完善)
  • 速卖通自养号测评系统构建指南:三大核心技术要点解析
  • 中国城乡建设厅网站首页长沙企业推广
  • 手机上怎么做自己卖菜的网站大埔建设工程交易中心网站
  • 东莞网站建设做网站wordpress 思源黑体
  • 人声增强AI开源软件
  • 学校网站设计理念哪些网站可以做微商
  • 网站制作学生信息管理太原贴吧
  • C语言模拟面向对象编程方法之封装
  • 公司制作网站价格表莱芜生活网
  • 购物网站asp源码门户网站维护
  • 0.5 数据增强、keras模型保存以及读取、绘制loss过程
  • wordpress网站维护页面模板做网站材料
  • 8.复合查询与内外连接
  • load_dotenv() 加载环境变量
  • 【C语言基础】数据类型、运算符与控制语句详解
  • 无限容量网站灵山建设局网站