一.常见算法--动态规划

(1)0-1背包问题

问题描述:

0-1背包问题的描述:在n种物品中选择1个或0个第i种物品,装入背包容量为m的背包,使得背包价值达到最大。

思路与关键点:

用到了max函数,用于返回两个数之中的较大值,包含在头文件<algorithm>中。下面的代码用头文<bits/stdc++.h>,包含几乎所有常用头文件。其中,当然包含<algorithm>。思路:对于每一个物品,有两种选择,要么放,要么不放。可以把问题分解成从背包容量为j<m的问题,无论j怎么变,我们都取其中的最优解,直到j=m时,就可以得到问题的最优解了。

下面的代码内部循环一边输入第i个物品的价值和重量,一边给背包容量为j的背包更新对应的背包最大价值,从m递减到放不下第i个物品时,第i轮更新结束。当外部循环从1递增到n时,就得到了n种物品放入背包容量为m的问题的最优解。

代码:

#include<bits/stdc++.h>using namespace std;const int MAXN = 1005;
int f[MAXN];  // 建立一个长度为MAX的数组,每个元素都为0int main() 
{int n, m;  printf("请输入物品的个数和背包的容量:"); cin >> n >> m;
printf("\n物品的数量是:%d,背包的容量是:%d\n",n,m); for(int i = 1; i <= n; i++) {printf("请输入第%d个物品的价值和重量\n",i);int v, w;//v是物品的价值,w是物品的重量 cin >> v >> w;      // 边输入边处理printf("第%d个物品的价值是:%d,重量是:%d\n",i,v,w);     for(int j = m; j >= w; j--)f[j] = max(f[j], f[j - w] + v);//判断是否选择第j个物品 }//输出背包容量为m的最大价值 
printf("背包的最大价值为:%d\n",f[m]);return 0;
}

运行结果:

c2a02aef5ffc4eaaae9d086314bdb64c.jpeg

时间复杂度与空间复杂度分析:

时间复杂度为主要是两个for循环为0(_n{2}),空间复杂度主要为变量为O(1)

(2)最长公共子序列问题

问题描述:

给定任意两个字符串,求求按下标严格递增的最长子序列长。例如:ABC和ADB这两个最长公共子序列为AB。意思就是说可以跳着取字符,但字符在原字符串的顺序保持不变。

思路与关键点:

Strlen()函数用来求字符数组的长度的,在头文件<string.h>中。思路:对于求长度为n的字符串a和长度为m的字符串b,我们有两种选择。第一种,可以看作 子问题求a去掉最后一个字符得到的子串和b进行比较,找到最大公共子串长。第二种,可以看作 子问题求b去掉最后一个字符得到的子串和a进行比较,找到最大公共子串长。去掉的字符有可能是a和b的共同字符,这时记录的最长公共字符串长度要加一。

下面代码中,数组f[i][j]记录了字符串a的前i个字符和字符串b的前j个字符的最长公共子串长。通过两层for循环,遍历由字符串a和b组成的二维表,每次减少一个不同的字符相当于缩小一行或一列。每次减少一个相同的字符,相当于,减少一行和一列;我们每次减少一个字符时,都进行上面讨论的两种选择比较,找到二者的最大值。

代码:

#include<stdio.h>
#include<string.h>int max(int a,int b)
{return a>b?a:b;
}
int main()
{int i,j,k; char a[600];char b[600];int f[600][600];//f[i][j]表示a字符串的前i个字符和b字符串的前j个字符的最长子序列长度 printf("请输入字符串a和b\n"); while(scanf("%s %s",a,b)!=EOF)//不停地输入字符串,判断最长公共子串长 {int n=strlen(a);//计算字符串a的长度 int m=strlen(b);/*当任意一个字符串为空时,它们的公共子串长为0*/ for(i=0;i<=n;i++){f[i][0]=0;}for(i=0;i<=m;i++){f[0][i]=0;}/*不断缩小搜索范围。*/ for(i=1;i<=n;i++){for(j=1;j<=m;j++){if(a[i-1]==b[j-1]){f[i][j]=f[i-1][j-1]+1;}else{f[i][j]=max(f[i-1][j],f[i][j-1]);}}}printf("最长公共子序列长度为:\n"); printf("%d\n",f[n][m]);printf("请输入字符串a和b\n"); }return 0;
}

运行结果:

时间复杂度与空间复杂度分析:

时间复杂度为主要是两个for循环为0(_n{2}),空间复杂度主要为二维数组为0(_n{2})

(3)最大子段和问题

问题描述:

思路与关键点:

我们要求连续的最大子段和,实际就是尽量找正数,跳过负数。所选的第一个数必然是正数。在下面的代码中,设置了一个临时变量b,用来存放当前的最大子段和。从0开始,遍历数组,b的初值为0,进入循环。b的值变为数组的第一个元素,如果第一个元素是正数,那么,更新sum的值为第一个元素的大小。如果是负数,就接着往后找,直到找到一个正数,开始计算后面的连续几个数的和,看看是否能够比当前的最大和sum大。如果比sum小,就不必更新sum。如果后面的数忽然出现负数,那么,一定会越加越小,最后小于0,就会从后面找到的第一个正数开始重新找连续的最大子段和。

代码:

#include<stdio.h>
int Maxsum(int n,int *a){int sum=0,b=0;for(int i=0;i<n;i++){if(b>0){b+=a[i];}else{b=a[i];}if(b>sum){sum=b;}}return sum;
}
int main(){int a[10]={1,2,6,9,0,-1,3,-2,9,8};int len=sizeof(a)/sizeof(a[0]); 
int Max=Maxsum(len,a);
printf("最大子段和为:%d\n",Max);
return 0;	
} 

运行结果:

时间复杂度与空间复杂度分析:

时间复杂度为0(n),空间复杂度主要为一维数组0(n)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/13401.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

为何Linux成为你不可或缺的技能

在数字化飞速发展的今天&#xff0c;无论你是IT行业的精英&#xff0c;还是其他领域的专业人士&#xff0c;掌握Linux都已经成为一项至关重要的技能。那么&#xff0c;为什么一定要学会Linux呢&#xff1f;以下文章仅供参考 1. 开源的力量&#xff1a;无限的可能性 Linux是一…

工厂自动化升级改造(3)-Modbus与MQTT的转换

什么是MQTT,Modbus,见下面文章 工厂自动化升级改造参考(01)--设备通信协议详解及选型-CSDN博客文章浏览阅读608次,点赞9次,收藏6次。>>特点:基于标准的以太网技术,使用TCP/IP协议栈,支持高速数据传输和局域网内的设备通信。>>>特点:跨平台的通信协议,…

java版数字藏品深色UI仿鲸探数藏盲盒合成短视频卡牌模式支持高并发功能介绍

根据您提供的艺术品发售系统的需求&#xff0c;以下是一个更为详细和全面的系统设计概述&#xff1a; 1. 藏品发售 藏品分类&#xff1a;藏品可以按照不同的类别进行分类&#xff0c;如绘画、雕塑、摄影等。稀有度设置&#xff1a;后台可以为每个藏品设置不同的稀有度&#x…

ssl证书价格一年多少钱?如何申请?

由于行业新规&#xff0c;现在阿里云、腾讯云等几乎所有平台都不再提供一年期免费证书&#xff0c;如果需要一年期证书则需要支付一定的费用。SSL证书的价格根据类型不同几十到几百上千不等。 一年期SSL证书申请通道https://www.joyssl.com/?nid16 一年期SSL证书申请流程&am…

人工智能(一)架构

一、引言 人工智能这个词不是很新鲜&#xff0c;早就有开始研究的&#xff0c;各种推荐系统、智能客服都是有一定的智能服务的&#xff0c;但是一直都没有体现出多高的智能性&#xff0c;很多时候更像是‘人工智障’。 但是自从chatGpt3被大范围的营销和使用之后&#xff0c;人…

基于springboot的中小型医院网站源码数据库

基于springboot的中小型医院网站源码数据库 本基于Spring Boot的中小型医院网站设计目标是实现用户网络预约挂号的功能&#xff0c;同时提高医院管理效率&#xff0c;更好的为广大用户服务。 本文重点阐述了中小型医院网站的开发过程&#xff0c;以实际运用为开发背景&#x…

基于PHP+MySQL开发的百娣美业课程管理软件系统后端功能介绍

如何开发一个美容产业链的商户管理系统。 1. 需求分析。 在开发美容产业链商户管理系统之前&#xff0c;必须首先进行需求分析。商户需要明确自己的需求和目标&#xff0c;了解系统的功能模块和业务流程&#xff0c;为后续发展提供明确的方向。 2. 系统设计。 根据需求…

python常用基础知识

目录 &#xff08;1&#xff09;print函数 &#xff08;2&#xff09;注释 &#xff08;3&#xff09;input函数 &#xff08;4&#xff09;同时赋值和连续赋值 &#xff08;5&#xff09;type函数和id函数 &#xff08;6&#xff09;python赋值是地址赋值 &#xff08;…

Qt编译和使用freetype矢量字库方法

在之前讲过QT中利用freetype提取字库生成图片的方法&#xff1a; #QT利用freetype提取字库图片_qt freetype-CSDN博客文章浏览阅读1.2k次。这是某个项目中要用到的片段&#xff0c;结合上一篇文章#QT从字体名获取字库文件路径使用// 保存位图int SaveBitmapToFile(HBITMAP hBi…

【会议征稿,ACM出版】第四届人工智能,大数据与算法国际学术会议 (CAIBDA 2024, 7/5-7)

由河南省科学院、河南大学主办&#xff0c;河南省科学院智慧创制研究所、河南大学学术发展部、河南大学人工智能学院承办的第四届人工智能&#xff0c;大数据与算法国际学术会议 (CAIBDA 2024)将于2024年7月5-7日于中国郑州隆重举行。CAIBDA 2024致力于为人工智能&#xff0c;大…

你还去营业厅注销流量卡吗?别浪费时间了,现在有三种方法都可以

家人们&#xff0c;不用的手机号你会注销吗&#xff1f;在这里小编提醒大家&#xff0c;不用的手机卡千万要记得注销&#xff0c;不能直接扔掉&#xff0c;不然可能收到天价欠费单。 ​  今天&#xff0c;小编整理汇总了三种常见的注销方法&#xff0c;不用再跑去营业厅了&a…

Spring的IOC(Inversion of Control)设计模式

Spring的IOC&#xff08;Inversion of Control&#xff09;是一种设计模式&#xff0c;它通过控制反转的思想来降低组件之间的耦合度。在Spring框架中&#xff0c;IOC容器负责管理应用程序中的对象&#xff0c;使得对象之间的依赖关系由容器来维护和注入。 以下是Spring IOC的…

google hack常用命令举例

Google 常用语法说明 site 指定域名 inurl URL 中存在的关键字页面 intext 网页内容里面的关键字 Filetype 指定文件类型 intitle 网页标题中的关键字 link 返回你所有的指定域名链接 info 查找指定站点信息 cache 搜索 Google 里的内容缓存 技巧 1&#xff1a;inurl&…

MySQL入门学习-数据查询.SELECT

MySQL是一种常用的关系型数据库管理系统&#xff0c;可以用于存储和管理大量的结构化数据。在MySQL中&#xff0c;SELECT语句用于从数据库中查询数据。它是最常用的SQL语句之一&#xff0c;具有以下特点&#xff1a; 1. SELECT语句用于从一个或多个表中选择数据&#xff0c;并…

拓展(华为优秀网站)

优秀网站示例&#xff1a; 鸿蒙内核源码分析 Feature Ability和AbilitySlice的关系 使用绘图组件Canvas绘制心率曲线图 多组示例演示三个样式的组合用法 列表组件ListContainer Linux下的Hi3861一站式鸿蒙开发烧录&#xff08;附工具&#xff09; 全球首发—鸿蒙开源平台…

碳纳米管须状触嗅觉多模态融合传感器在皮革奢侈品真伪鉴定下的设计探索

一、设计方案 1.传感器选择 触觉传感器&#xff1a;选择基于碳纳米管&#xff08;CNT&#xff09;聚合物的柔性MEMS触觉微传感器&#xff0c;由于碳纳米管具有高度的灵敏度和选择性、柔韧性&#xff0c;可以作为触觉传感器&#xff0c;检测材料的微观结构和机械特性。嗅觉传感…

网页打开:为什么国内用新标签页,国外用当前页?

想写这个话题很久了&#xff0c;因为用百度和Google搜索时&#xff0c;打开搜索结果链接时的交互差异&#xff0c;几乎每天都要提醍我一下。 网页打开——这个交互&#xff0c;在设计里&#xff0c;算是极微小&#xff0c;但影响极广泛的操作设计。甚至&#xff0c;因此形成了…

Android 不透明度颜色值

<!--百分比-开头字母--> <!--100% —#FF--> <!--99% — #FC--> <!--98% — #FA--> <!--97% — #F7--> <!--96% — #F5--> <!--95% — #F2--> <!--94% — #F0--> <!--93% — #ED--> <!--92% — #EB--> <!--91% …

【Python】图形用户界面设计

1、设计并编写一个窗口程序,该窗口只有一个按钮,当用户单击时可在后台输出hello world. import tkinter as tk def on_button_click():print("hello world") # 创建主窗口 root tk.Tk() root.title("Hello World Button") # 设置窗口大小 root.geometry…

代码随想录-算法训练营day41【动态规划04:01背包问题-滚动数组、分割等和子集】

代码随想录-035期-算法训练营【博客笔记汇总表】-CSDN博客 第九章 动态规划part04● 01背包问题,你该了解这些! ● 01背包问题,你该了解这些! 滚动数组 ● 416. 分割等和子集 正式开始背包问题,背包问题还是挺难的,虽然大家可能看了很多背包问题模板代码,感觉挺简单,…