排列问题、整数划分问题-程序员宅基地

技术标签: 算法  递归与分治策略的实现  

1、排列问题:设r={r1,r2,…,rn}是n个元素的集合,求r的全排列。

(1)设计思想:

设 R={r1,r2,,rn} 是要进行排列的n个元素。Rᵢ=R−rᵢ。 集合X中元素的全排列记为 ᵢPerm(X)(rᵢ)Perm(X))表示在全排列Perm(X)的每个排列前加上前缀n ᵢrᵢ得到的排列。R的全排列可归纳定义如下:

当n=1时, Perm(R)=(r),其中r是集合R中唯一的元素;

当n>1时, Perm(R)由 (r1)Perm(R1),(r2)Perm(R2),,(rn)Perm(Rn) 构成。

依此递归定义,可设计产生Perm(R)的递归算法如下:

(2)程序代码:

#include<stdio.h>
#include"iostream.h"
template <class Type>
void Perm(Type list[],int k,int m)
{
if(k==m)
{
for(int i=0;i<=m;i++)
cout<<list[i];
cout<<endl;
}
else
{
for(int i=k;i<=m;i++)
{
Swap(list[k],list[i]);
Perm(list,k+1,m);
Swap(list[k],list[i]);
}
}
}
template<class Type>
inline void Swap(Type &a,Type &b)
{
Type temp=a;
a=b;
b=temp;
}
void main()
{
int ar[]={1,2,3};
int n=sizeof(ar)/sizeof(ar[0]);
Perm(ar,0,n-1);
}

实验结果:

2、整数划分问题:将正整数n表示成一系列正整数之和,正整数n的这种表示称为正整数n的划分。求正整数n的不同划分的个数。例如:正整数6有11中不同的划分。

(1)设计思想:

在正整数n的所有划分中,将最大加数n₁不大于m的划分个数记作q(nm)。可以建立q(n,m)的如下递归关系:

q(n,m)={1   q(n,n)   1+q(n,n−1)   q(n,m−1)+q(n-m,m)}

 n=1,m=1     n< m    n=m   n>m>1

据此,可设计计算q(n,m)的递归函数如下。正整数n的划分数p(n)=q(n,n)。

#include<iostream>

using namespace std;

int main()

{

int a,b,c;

int q(int n,int m);

cout<<"请输入整数及大于最大加数的数"<<endl;

cin>>a>>b;

c=q(a,b);

cout<<"所需要的划分数:"<<c<<endl;

return 0;

}

int q(int n,int m)

{

if((n<1)||(m<1)) return 0;

if((n==1)||(m==1)) return 1;

if(n<m) return q(n,n);

if(n==m) return q(n,m-1)+1;

return q(n,m-1)+q(n-m,m);

}

实验结果

3、二分搜索技术:设a[0:n-1]是一个已排好序的数组。请改写二分搜索算法,使得当搜索元素x不在数组中时,返回小于x的最大元素的位置I和大于x的最大元素位置j。当搜索元素在数组中时,I和j相同,均为x在数组中的位置。

(1)设计思想:

时间完成搜索任务。二分搜索算法的基本思想是,将n个元素分成个数大致相同的两半,取a[n/2]与x作比较。如果x=a[n/2],则找到x,算法终止;如果x<a[n/2],则只在数组a的左半部继续搜索x;如果x>a[n/2],则只在数组a的右半部继续搜索x。

(2)程序代码:

#include<iostream>
using namespace std;
int main()
{
int const length=100;
int n,x;
int a[length];
cout<<"依次输入数组的长度,数组内容、要查找的数"<<endl;
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
cin>>x;
void BinarySearch(int a[],int n,int x);
BinarySearch(a,n,x);
return 0;
}
void BinarySearch(int a[],int n,int x)
{
int i,j,mid=0,left=0;
int right=n-1;
while(left<right+1&&left>=0)
{
int mid=(left+right)/2;
if(x==a[mid])
{
i=j=mid;
break;
}
if(x>a[mid])
left=mid+1;
else
right=mid-1;
}
if((i=j)&&(i>=0))
cout<<"所找数据在数组中下标为:"<<i<<endl;
else
cout<<"所找数据不在数组中";
}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_65502432/article/details/137003909

智能推荐

java/jsp/ssm基于web的多媒体素材管理系统【2024年毕设】_基于web的多媒体素材管理系统zip-程序员宅基地

文章浏览阅读53次。springboot基于Springboot的企业cms内容管理系统。springboot基于Vue和Springboot的会议室管理系统。开发软件:eclipse/myeclipse/idea。springboot中小型企业物流管理系统的设计与实现。springboot微信小程序的食谱大全“食全食美”springboot基于微信小程序的舟袍设计工作室。ssm基于web的佳茗天香茶品销售平台的设计与实现。springboot医考答题练习系统的设计与实现。springboot微信小程序的火锅店点餐系统。_基于web的多媒体素材管理系统zip

vue多种实现动画效果分享【推荐学习】_vue 动画-程序员宅基地

文章浏览阅读1k次。通常我们实现动画效果会用到CSS中的class类,这也是比较基本的方式实现动画。_vue 动画

免费送书!从ROS1到ROS2,无人机编程实战指南-程序员宅基地

文章浏览阅读340次。亲爱的读者们,我们今天非常荣幸地向大家推荐一本全新力作——《从ROS1到ROS2无人机编程实战指南》。这本书站在初学者的角度,从入门到进阶,再到实战,循序渐进,是学习ROS1和ROS2的最佳选择。如今已在全国范围内上市,购书即可享受次日达的快捷服务!本书的创作初衷源于帮助那些渴望投身于无人机或机器人开发的初学者。目前,国内关于ROS的书籍相当稀缺,大部分都是国外翻译版,内容可能更偏向于机器人学的公..._从ros1到ros2无人机编程实战指南

tkinter创建子窗口(只创建一个)_tkinter子窗口-程序员宅基地

文章浏览阅读635次。【代码】tkinter创建子窗口(只创建一个)_tkinter子窗口

基于微信小程序的小说阅读系统+vue.js附带文章和源代码设计说明文档ppt_微信小程序书代码-程序员宅基地

文章浏览阅读345次,点赞9次,收藏6次。博主介绍:CSDN特邀作者、985计算机专业毕业、某互联网大厂高级全栈开发程序员、码云/掘金/华为云/阿里云/InfoQ/StackOverflow/github等平台优质作者、专注于Java、小程序、前端、python等技术领域和毕业项目实战,以及程序定制化开发、全栈讲解、就业辅导、面试辅导、简历修改。精彩专栏 推荐订阅2023-2024年最值得选的微信小程序毕业设计选题大全:100个热门选题推荐2023-2024年最值得选的Java毕业设计选题大全:500个热门选题推荐。_微信小程序书代码

没有U盘Win10电脑下如何使用本地硬盘安装Ubuntu20.04(单双硬盘都行)_没有u盘怎么装ubuntu-程序员宅基地

文章浏览阅读3.6k次,点赞2次,收藏2次。DELL7080台式机两块硬盘。_没有u盘怎么装ubuntu

随便推点

维修Proface普洛菲斯触摸屏GP-4502WW 4301 4501TW 4401T人机界面-程序员宅基地

文章浏览阅读498次,点赞14次,收藏4次。伦茨、KEB、西门子、力士乐、施耐德电气、、鲍米勒、丹佛斯、派克、三菱、Allen Bradley、ABB、罗克韦尔、东芝、Gerfan、松下、Proface、台达、Beckhoff、Omron欧姆龙、Sumitomo住友、Sodick沙迪克、SedoTreepoint、WEINVIEW威纶通、Axiomtek艾讯、Portwell瑞传、Laetus.......等各大知名进口品牌工控机。W275 x H206 x D38.2 毫米 [W10.85 x H8.11 x D1.50 英寸]

Apipost 上手指南_apipost上传文件接口-程序员宅基地

文章浏览阅读4.3k次。Apipost是一个用于Web开发的接口调试工具,由国人开发。目前版本:7.0类似的产品还有,不过个人感觉功能上不如Apipost好用。_apipost上传文件接口

linux单机巡检脚本并发送邮箱的巡检报告-程序员宅基地

文章浏览阅读389次,点赞10次,收藏10次。案例,生成的巡检报告邮件。

强强联手:强网杯LongTimeAgo复盘分析网络安全-程序员宅基地

文章浏览阅读141次。LongTimeAgo题目是一道备受关注的CTF(Capture The Flag)题目,旨在考察参赛选手在网络安全方面的技能和知识。该题目主要涉及密码学和逆向工程的内容,要求选手通过分析给定的程序,找到隐藏的漏洞并获取关键信息。该题目主要涉及到密码学和逆向工程的内容,需要选手通过分析给定的程序,找到隐藏的漏洞并获取关键信息。观察源代码中的加密函数,我们可以发现密钥的长度是可变的,它取决于输入明文的长度。观察源代码中的加密函数,我们可以发现密钥的长度是可变的,它取决于输入明文的长度。是当前明文字符的索引。_强网杯

【嵌入式总复习】Linux进程间通信_嵌入式 linux 跨进程 信号-程序员宅基地

文章浏览阅读289次。进程间通信简称IPC(interprocess communication),是指在不同进程间传播或交换信息。一个进程需要另一个或另一组进程发送消息,通知它(们)发生了某种事件;一个进程需要将它的数据发送给另一个进程;,信号量,共享内存,消息队列和套接字。多个进程之间共享同样的资源;一个进程完全控制另一个进程;传统的UNIX进程间通信机制。System V IPC机制。System V 消息队列。System V 共享内存。System V 信号量。POSIX 消息队列。POSIX 共享内存。_嵌入式 linux 跨进程 信号

发行版Linux和麒麟操作系统下netperf 网络性能测试-程序员宅基地

文章浏览阅读175次。Netperf是一种网络性能的测量工具,主要针对基于TCP或UDP的传输。Netperf根据应用的不同,可以进行不同模式的网络性能测试,即批量数据传输(bulk data transfer)模式和请求/应答(request/reponse)模式。工作原理Netperf工具以client/server方式工作。server端是netserver,用来侦听来自client端的连接,c..._netperf 麒麟

推荐文章

热门文章

相关标签