【九十四】【算法分析与设计】练习四蛮力法练习,排列问题和组合问题,求解最大连续子序列和问题,求解幂集问题,求解0/1背包问题,求解任务分配问题

求解最大连续子序列和问题

给定一个有n(n≥1)个整数的序列,要求求出其中最大连续子序列的和。

例如:

序列(-2,11,-4,13,-5,-2)的最大子序列和为20

序列(-6,2,4,-7,5,3,2,-1,6,-9,10,-2)的最大子序列和为16。

规定一个序列最大连续子序列和至少是0(看成0个元素构成的子序列),如果小于0,其结果为0。

1.

子数组累加和最大值问题,如何划分问题,子数组应该如何划分?

可以划分为以某一个位置结尾的子数组,以i位置结尾的子数组.

所有的子数组被划分成以0下标结尾的子数组,以1下标结尾的子数组.......

我们只需要解决每一个划分出来的子数组集合对应的问题即可.

也就是解决以某一个位置结尾的子数组累加和最大值是多少.

2.

以i位置结尾的子数组可以划分成两种,第一种是只包含i位置元素,第二种是不只包含i位置元素.

只包含i位置元素的累加和最大值为arr[i],不只包含i位置元素的累加和最大值为arr[i]+(以i-1位置结尾的子数组累加和最大值).

我们要求最大值,所以以i位置结尾的子数组累加和最大值为max(arr[i],arr[i]+(以i-1位置结尾的子数组累加和最大值)).

3.

动态规划,自底向上的动态规划和自顶向下的动态规划.

自底向上的动态规划写法

 
#include<bits/stdc++.h> // 导入标准库头文件
using namespace std; // 使用标准命名空间
#define int long long // 将int类型定义为long long类型,便于处理大数
#define endl '\n' // 将endl定义为换行符// 定义两个测试用的数组
vector<int>arr1 = { -2,11,-4,13,-5,-2 };
vector<int>arr2 = { -6,2,4,-7,5,3,2,-1,6,-9,10,-2 };// 定义一个动态规划数组和一个存储当前数组的变量
vector<int>dp;
vector<int>arr;
// 定义存储最大子数组和的变量
int ret;// 初始化函数
void init() {dp.assign(arr.size(), 0); // 将dp数组初始化为和当前数组相同大小,并赋初值为0ret = 0; // 将ret初始化为0
}// 求解最大子数组和的函数
void solve() {for (int i = 0; i < arr.size(); i++) { // 遍历数组中的每一个元素dp[i] = max((i - 1 >= 0 ? dp[i - 1] : 0) + arr[i], arr[i]); // 计算以当前位置结尾的最大子数组和ret = max(ret, dp[i]); // 更新最大子数组和}cout << ret << endl; // 输出结果
}// 测试函数
void f() {arr = arr1; // 将数组设置为arr1init(); // 初始化solve(); // 求解arr = arr2; // 将数组设置为arr2init(); // 初始化solve(); // 求解
}// 主函数
signed main() {ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); // 提高输入输出效率f(); // 调用测试函数
}

自顶向下的动态规划写法(记忆化递归)

 
#include<bits/stdc++.h> // 导入标准库头文件
using namespace std; // 使用标准命名空间
#define int long long // 将int类型定义为long long类型,便于处理大数
#define endl '\n' // 将endl定义为换行符// 定义两个测试用的数组
vector<int>arr1 = { -2,11,-4,13,-5,-2 };
vector<int>arr2 = { -6,2,4,-7,5,3,2,-1,6,-9,10,-2 };// 定义一个当前数组的变量和一个存储最大子数组和的变量
vector<int>arr;
int ret;// 定义一个动态规划数组
vector<int>dp;// 记忆化递归函数,求以位置i结尾的最大子数组和
int dfs(int i) {if (dp[i] != -1) return dp[i]; // 如果dp[i]已被计算,则直接返回dp[i]if (i - 1 < 0) { // 如果i是第一个元素dp[i] = arr[i]; // 直接返回arr[i]return dp[i]; // 返回dp[i]}dp[i] = max(dfs(i - 1) + arr[i], arr[i]); // 计算dp[i],取包含i的子数组和与仅包含i元素的子数组和的最大值ret = max(ret, dp[i]); // 更新最大子数组和return dp[i]; // 返回dp[i]
}// 初始化函数
void init() {ret = 0; // 将ret初始化为0dp.assign(arr.size(), -1); // 将dp数组初始化为和当前数组相同大小,并赋初值为-1
}// 求解最大子数组和的函数
void solve() {for (int i = 0; i < dp.size(); i++) dfs(i); // 遍历数组中的每一个元素,调用dfs函数cout << ret << endl; // 输出结果
}// 测试函数
void f() {arr = arr1; // 将数组设置为arr1init(); // 初始化solve(); // 求解arr = arr2; // 将数组设置为arr2init(); // 初始化solve(); // 求解
}// 主函数
signed main() {ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); // 提高输入输出效率f(); // 调用测试函数
}

求解幂集问题

对于给定的正整数3,求1~3构成的集合的所有子集(幂集)。

{}

{1}

{2}

{1,2}

{3}

{1,3}

{2,3}

{1,2,3}

1.

组合问题,有3个整数,选出其中的部分整数作为一个集合,所有不同的情况都列出来.

对于任意的整数,在选出来的集合中,都可以选择或者不选择两种方案.

所以一共有2^3种方案.对于数字1可以选择或者不选择,对于数字2可以选择或者不选择,对于数字3可以选择或者不选择.

一共有2*2*2=2^3种方案数.

2.

在每一种方案中对于每一个数字,都有对应的选择,选择或者不选择,因此可以用1表示选择0表示不选择.

例如空集对应000,{1}对应100,{2}对应010,{1,2}对应110....{1,2,3}对应111.

如果000~111全部是二进制数,那么对应的十进制数是0~2^3-1.

每一个数的二进制都对应一种方案.

3.

对于每一种方案,只需要提取对于二进制数所有位置的1就知道选择了哪些元素.

 
#include<bits/stdc++.h> // 导入标准库头文件
using namespace std; // 使用标准命名空间
#define int long long // 将int类型定义为long long类型,便于处理大数
#define endl '\n' // 将endl定义为换行符// 定义一个包含1,2,3的数组
vector<int> arr = { 1,2,3 };
// 定义一个变量n来存储幂集的大小
int n;// 初始化函数
void init() {n = pow(2, arr.size()); // 计算幂集的大小,即2的arr.size()次幂
}// 求解幂集的函数
void solve() {for (int i = 0; i < n; i++) { // 遍历从0到2^arr.size() - 1的所有整数cout << "{ "; // 输出子集的左花括号for (int j = 0; j < arr.size(); j++) { // 遍历数组中的每一个元素if (i & (1 << j)) { // 检查整数i的第j位是否为1cout << arr[j] << " "; // 如果是,则输出对应的数组元素}}cout << "}" << endl; // 输出子集的右花括号和换行符}
}// 主函数
signed main() {ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); // 提高输入输出效率init(); // 初始化solve(); // 求解幂集
}

求解0/1背包问题

有n个重量分别为{w1,w2,…,wn}的物品,它们的价值分别为{v1,v2,…,vn},给定一个容量为W的背包。设计从这些物品中选取一部分物品放入该背包的方案,每个物品要么选中要么不选中,要求选中的物品不仅能够放到背包中,而且具有最大的价值。

并对下表所示的4个物品求出W=6时的所有解和最佳解。

物品编号

重量

价值

1

5

4

2

3

4

3

2

3

4

1

1

1.

0/1背包问题也是组合问题.有n个物品,选择一部分物品出来放到一个集合里面.

2.

一共有4个物品,每一个物品对应一个二进制数,一共是四个位置的二进制数,0~2^4-1.

每一个数对应一种选择方案,要么选择要么不选择.

一共有2^4种方案数.

3.

printf输入格式很方便,但是要注意string转化为c_str().

 
#include<bits/stdc++.h> // 导入标准库头文件
using namespace std; // 使用标准命名空间
#define int long long // 将int类型定义为long long类型,便于处理大数
#define endl '\n' // 将endl定义为换行符// 定义一个结构体node,用来存储物品的重量和价值
struct node {int weight; // 物品重量int value; // 物品价值
};// 定义变量n表示物品数量,nsize表示所有可能选择方案的数量,maxWeight表示背包的最大承重
int n = 0;
int nsize = 0;
int maxWeight = 6; // 背包最大承重为6// 定义一个包含4个物品的数组,每个物品包含重量和价值
vector<node> arr = { {5,4},{3,4},{2,3},{1,1} };// 定义一个结构体node1,用来存储选择方案的字符串表示、总重量和总价值
struct node1 {string str = ""; // 选择方案的字符串表示int weight = 0; // 选择方案的总重量int value = 0; // 选择方案的总价值
};// 定义一个变量ret,用来存储最佳选择方案
node1 ret;// 初始化函数
void init() {n = 4; // 物品数量为4nsize = pow(2, n); // 所有可能选择方案的数量为2^4=16
}// 求解0/1背包问题的函数
void solve() {cout << "0/1背包求解方案" << endl; // 输出标题// 输出表头printf("%-10s%-20s%-10s%-10s%-10s\n", "序号", "选中物品", "总重量", "总价值", "能否装入");for (int i = 0; i < nsize; i++) { // 遍历所有可能的选择方案node1 temp; // 定义一个临时变量temp来存储当前选择方案temp.str.push_back('{'); // 添加左花括号temp.str.push_back(' ');for (int j = 0; j < n; j++) { // 遍历所有物品if (i & (1 << j)) { // 检查当前选择方案是否选择了第j个物品temp.str.push_back(j + '1'); // 如果选择了,则将物品编号添加到字符串中temp.str.push_back(' ');temp.weight += arr[j].weight; // 将物品的重量加到总重量中temp.value += arr[j].value; // 将物品的价值加到总价值中}}temp.str.push_back('}'); // 添加右花括号// 如果当前选择方案的总重量小于等于背包的最大承重且总价值大于当前最佳选择方案的总价值,则更新最佳选择方案if (temp.weight <= maxWeight && temp.value > ret.value) ret = temp;// 输出当前选择方案的序号、字符串表示、总重量、总价值和是否能装入背包printf("%-10lld%-20s%-10lld%-10lld%-10s\n", i + 1, temp.str.c_str(), temp.weight, temp.value, temp.weight <= maxWeight ? "能" : "否");}// 输出最佳选择方案的字符串表示、总重量和总价值printf("最佳方案为 选中物品:%s,总重量:%lld,总价值:%lld", ret.str.c_str(), ret.weight, ret.value);
}// 主函数
signed main() {ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); // 提高输入输出效率init(); // 初始化solve(); // 求解0/1背包问题
}

求解任务分配问题

有n(n≥1)个任务需要分配给n个人执行,每个任务只能分配给一个人,每个人只能执行一个任务。

第i个人执行第j个任务的成本是c[i][j](1≤i,j≤n)。求出总成本最小的分配方案

【问题求解】所谓一种分配方案就是由第i个人执行第j个任务,用(a1,a2,…,an)表示,即第1个人执行第a1个任务,第2个人执行第a2个任务,以此类推。全部的分配方案恰好是1~n的全排列。

这里采用穷举法求出所有的分配方案ps(全排列),再计算出每种方案的成本,比较求出最小成本的方案,即最优方案。以n=4,成本如下表所示为例讨论。

1.

排列问题,将4个任务进行全排列,列出所有的情况.

用内置函数next_premutation函数找到所有的全排序序列.

模板:

 
        vector<int> arr = { 1,2,3,4 };do {// 输出当前的排列for (int num : arr) {cout << num << " ";}cout << endl;} while (next_permutation(arr.begin(), arr.end()));

2.

用内置函数next_premutation找到所有的全排序序列的前提是需要arr排序完毕.

 

//内置函数求全排序模板
#if 0#include<bits/stdc++.h>
using namespace std;
#define int long long 
#define endl '\n'
void init() {}
void solve() {}signed main() {ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);init();solve();vector<int> arr = { 1,2,3,4 };do {// 输出当前的排列for (int num : arr) {cout << num << " ";}cout << endl;} while (next_permutation(arr.begin(), arr.end()));}#endif // 1#if 1#include<bits/stdc++.h> // 导入标准库头文件
using namespace std; // 使用标准命名空间
#define int long long // 将int类型定义为long long类型,便于处理大数
#define endl '\n' // 将endl定义为换行符// 定义一个结构体node,用来存储一个分配方案及其总成本
struct node {vector<int>people = { 0,0,0,0 }; // 分配方案int total = 0; // 总成本
};// 定义成本矩阵
vector<vector<int>> cost = {{9,2,7,8},{6,4,3,7},{5,8,1,8},{7,6,9,4}
};// 定义一个包含任务序号的数组
vector<int>arr = { 1,2,3,4 };
// 定义一个变量ret,用来存储最优方案
node ret;// 初始化函数
void init() {ret.total = INT_MAX; // 将最优方案的总成本初始化为最大值
}// 求解任务分配问题的函数
void solve() {do {node temp; // 定义一个临时变量temp来存储当前分配方案for (int i = 0; i < arr.size(); i++) { // 遍历所有任务temp.total += cost[i][arr[i] - 1]; // 累加当前分配方案的总成本}temp.people = arr; // 将当前分配方案赋值给temp的people字段if (ret.total > temp.total) ret = temp; // 如果当前分配方案的总成本小于最优方案的总成本,则更新最优方案} while (next_permutation(arr.begin(), arr.end())); // 生成下一个排列printf("最优方案:\n"); // 输出最优方案for (int i = 0; i < 4; i++) { // 遍历所有人printf("第%lld个人安排任务%lld\n", i + 1, ret.people[i]); // 输出每个人对应的任务}printf("总成本=%lld\n", ret.total); // 输出总成本
}// 主函数
signed main() {ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); // 提高输入输出效率init(); // 初始化solve(); // 求解任务分配问题
}#endif // 1

结尾

最后,感谢您阅读我的文章,希望这些内容能够对您有所启发和帮助。如果您有任何问题或想要分享您的观点,请随时在评论区留言。

同时,不要忘记订阅我的博客以获取更多有趣的内容。在未来的文章中,我将继续探讨这个话题的不同方面,为您呈现更多深度和见解。

谢谢您的支持,期待与您在下一篇文章中再次相遇!

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

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

相关文章

第 33 次CCF认证

1. 词频统计 题目描述 样例输入 代码 #include <bits/stdc.h>using namespace std;int main() {int n,m;cin>>n>>m;vector<int> ans1(m,0),ans2(m,0);while (n --) {int t;cin>>t;vector<int> vis(m1,0);for (int i 1;i < t;i ) {i…

数据结构(五)

数据结构&#xff08;五&#xff09; 常见的排序算法内部排序交换插入选择归并基数 外部排序基于归并的 常见的排序算法 内部排序 交换 冒泡&#xff1a;每一次运行总会将最小的或者最大的放到前面&#xff0c;如果需要交换&#xff0c;一直在交换 快速排序*&#xff1a;经过…

2024最新前端面试八股文【基础篇293题】

⼀、HTML、HTTP、web综合问题 1 前端需要注意哪些SEO 2 <img> 的 title 和 alt 有什么区别 3 HTTP的⼏种请求⽅法⽤途 4 从浏览器地址栏输⼊url到显示⻚⾯的步骤 5 如何进⾏⽹站性能优化 6 HTTP状态码及其含义 7 语义化的理解 8 介绍⼀下你对浏览器内核的理解 9 …

【操作系统】发展与分类(手工操作、批处理、分时操作、实时操作)

2.操作系统发展与分类 思维导图 手工操作阶段&#xff08;此阶段无操作系统&#xff09; 需要人工干预 缺点&#xff1a; 1.用户独占全机&#xff0c;资源利用率低&#xff1b; 2.CPU等待手工操作&#xff0c;CPU利用不充分。 批处理阶段&#xff08;操作系统开始出现&#x…

正运动控制器:视觉纠偏和找孔

一、用户主界面CCD参数设置 通过主界面CCD参数设置&#xff0c;学习如何操作计算相机中心与电批中心的偏移量&#xff0c;以及相机标定的功能。 1、相机中心与电批中心的偏移量计算 1.1、在用户主界面点击CCD参数按钮&#xff0c;进入CCD设置界面。 主界面 CCD参数设置界面 1…

制作电子画册速成攻略,快来试试

​当今社会&#xff0c;数字媒体日益普及&#xff0c;电子画册作为一种崭新的展示方式&#xff0c;受到了越来越多人的青睐。它不仅形式新颖&#xff0c;互动性强&#xff0c;而且制作起来也并不复杂。想知道如何快速掌握制作电子画册的技巧吗&#xff1f;我来教你吧。 接下来&…

推荐13款常用的Vscode插件,提高前端日常开发效率

1. Live Server Live Server 插件是一个用于前端开发的扩展&#xff0c;它的主要作用是提供一个本地开发服务器&#xff0c;以便实时预览和调试网页应用程序。其最大特点在于热重载&#xff0c;即开发者可实时预览代码效果。 因为Live Server 允许开发者在浏览器中实时预览您正…

Llama 3没能逼出GPT-5!OpenAI怒“卷”To B战场,新企业级 AI 功能重磅推出!

Meta 是本周当之无愧的AI巨星&#xff01;刚刚推出的 Llama 3 凭借着强大的性能和开源生态的优势在 LLM 排行榜上迅速跃升。 按理说&#xff0c;Llama 3在开源的状态下做到了 GPT-3.7 的水平&#xff0c;必然会显得用户&#xff08;尤其是企业用户&#xff0c;他们更具备独立部…

C#调用HttpClient.SendAsync报错:System.Net.Http.HttpRequestException: 发送请求时出错。

C#调用HttpClient.SendAsync报错&#xff1a;System.Net.Http.HttpRequestException: 发送请求时出错。 var response await client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead, cancellationToken);问题出在SSL/TLS&#xff0c;Windows Server 2012不支持…

Vue3解决“找不到模块“@/components/xxx.vue”或其相应的类型声明”

文章目录 前言背景问题描述解决方案总结 前言 在使用 Vue 3 开发项目时&#xff0c;遇到“找不到模块 ‘/components/xxx.vue’ 或其相应的类型声明”的错误是一个常见问题。这通常与 TypeScript 和模块解析相关的配置不当有关。本文将详细介绍如何解决此问题&#xff0c;确保…

2024-6-遥远的救世主

2024-6-遥远的救世主 2024-4-18 豆豆 fatux&#xff1a; 2021.5.26 看完电视剧《天道》之后购买本书&#xff0c;断断续续一直没有读完。 非常好奇&#xff0c;一个什么样的作者能写出如此奇书。老丁&#xff0c;一个智者&#xff0c;智者是多么孤独&#xff0c;因为找不到同…

信息安全等级保护测评: 登陆日志

文章目录 引言I 登录日志表结构设计II 日志处理2.1 封装日志入库2.2 收集登陆信息2.3 查询接口引言 等保测评是信息安全等级保护测评的简称,是对信息和信息载体按照重要性等级分级别进行检测、评估的过程。 背景:近期AIS监控平台(网页版)等保测评,发现没有登陆日志,现要…

从用法到源码再到应用场景:全方位了解CompletableFuture及其线程池

文章目录 文章导图什么是CompletableFutureCompletableFuture用法总结API总结 为什么使用CompletableFuture场景总结 CompletableFuture默认线程池解析&#xff1a;ForkJoinPool or ThreadPerTaskExecutor&#xff1f;ForkJoinPool 线程池ThreadPerTaskExecutor线程池Completab…

Qt 界面上字体自适应控件大小 - 随控件缩放

Qt 界面上字体自适应控件大小 - 随控件缩放 引言一、设计思路二、进阶版大致思路三、参考链接 引言 Qt控件自适应字体大小可以用adjustSize()函数&#xff0c;但字体自适应控件大小并没有现成的函数可调. - 本文实现了按钮上的字体随按钮大小变化而变化 (如上图所示) - 其他控件…

Spring MVC+mybatis 项目入门:旅游网(三)用户注册——控制反转以及Hibernate Validator数据验证

个人博客&#xff1a;Spring MVCmybatis 项目入门:旅游网&#xff08;三&#xff09;用户注册 | iwtss blog 先看这个&#xff01; 这是18年的文章&#xff0c;回收站里恢复的&#xff0c;现阶段看基本是没有参考意义的&#xff0c;技术老旧脱离时代&#xff08;2024年辣铁铁&…

澳大利亚.德国-门户媒体投放通稿:需要注意什么地方

概述 在现代社会&#xff0c;新闻媒体的投放成为企业和组织宣传推广的重要手段之一。澳大利亚和德国作为全球重要的经济和科技中心&#xff0c;其新闻媒体也备受关注。本文将介绍澳大利亚和德国的一些主要新闻媒体&#xff0c;并讨论发表新闻稿时需要注意的地方。 澳大利亚媒…

streamlit 学习

表情网站 https://getemoji.com/ 官网&#xff1a; https://streamlit.io/ 文档 https://docs.streamlit.io/develop/api-reference/chat/st.chat_message 安装&#xff1a; pip install streamlit启动 以下的python 文件指写streamlit 程序的脚步。 1、先切换目录到Pyth…

VMware虚拟机-设置系统网络IP、快照、克隆

1.设置网络IP 1.点击右上角开关按钮-》有线 已连接-》有线设置 2.手动修改ip 3.重启或者把开关重新关闭开启 2.快照设置 快照介绍&#xff1a; 通过快照可快速保存虚拟机当前的状态&#xff0c;后续可以使用虚拟机还原到某个快照的状态。 1.添加快照(需要先关闭虚拟机) 2.在…

[JAVASE] 类和对象(六) -- 接口(续篇)

目录 一. Comparable接口 与 compareTo方法 1.1 Comparable接口 1.2 compareTo方法的重写 1.2.1 根据年龄进行比较 1.2.2 根据姓名进行比较 1.4 compareTo 方法 的使用 1.3 compareTo方法的缺点(重点) 二. Comparator接口 与 compare方法 2.1 Comparator接口 2.2 compare 方法…

蓝桥杯算法心得——李白打酒(加强版)

大家好&#xff0c;我是晴天学长&#xff0c;记忆化搜索&#xff0c;找到技巧非常重要&#xff0c;需要的小伙伴可以关注支持一下哦&#xff01;后续会继续更新的。&#x1f4aa;&#x1f4aa;&#x1f4aa; 2) .算法思路 1.memo三维表示记录的结果 3&#xff09;.算法步骤 1…