NEFU离散数学实验1-排列组合

news2024/11/18 10:55:23

相关概念 

在离散数学中,组合数是一种用于计算从n个不同元素中选取m个元素的方式。以下是一些与组合数相关的概念:

  1. 排列:从n个不同元素中选取m个元素进行排列,排列数用P(n, m)表示,计算公式为P(n, m) = n! / (n - m)!

  2. 组合:从n个不同元素中选取m个元素进行组合,组合数用C(n, m)表示,计算公式为C(n, m) = n! / (m! * (n - m)!)

  3. 二项式系数:组合数也称为二项式系数,表示为C(n, m)。二项式系数可以用来展开二项式表达式的系数,如(a + b)^n的展开式中,每一项的系数就是C(n, m)。

  4. 杨辉三角形:杨辉三角形是一种图形化展示组合数的方式。在杨辉三角形中,每个数是它上方两个数之和,每一行的两端数都为1,其余数为上方两个数之和。杨辉三角形中的每个数就是组合数C(n, m)。

  5. 组合恒等式:组合恒等式是指一系列关于组合数的等式,如C(n, m) = C(n, n - m),C(n, m) = C(n - 1, m - 1) + C(n - 1, m)等等。这些等式可以用于简化组合数的计算。

1. (程序题)

非降路径

在平面直角坐标系内,有(a,b)和(c,d)两点,且a,b,c,d都大于0,而且(c,d)点位于(a,b)点的右上方!

从(a,b)出发走到(c,d)点,只能向上走和向右走,请问共有多少种走法(非降路径数)?

输入:

输入a,b,c,d(0<=a,b,c,d<=12)

输出:

输出非降路径数!

例子输入:

0 0 2 2

例子输出:

6

#include <iostream>

using namespace std;



int Count(int n,int m)

{

    if(n==m||m==0)

        return 1;

    else

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

}



int main()

{

    int a,b,c,d,sum;

    while(cin>>a>>b>>c>>d){

    sum=Count(c-a+d-b,c-a);

    cout<<sum<<endl;

    }

    return 0;

}

直接用书上P199公式吧

ans=C_{c-a+d-b}^{c-a}

本质是求组合数,数据非常友好,但是你直接阶乘会溢出的,所以我们求组合数要用递推式

2. (程序题)特殊的非降路径

设a,b,c,d,m,n是非负整数,其中 a<=c<=m,b<=d<=n;请你计算从(a,b)点经过(c,d)点到(m,n)点的非降路径数?

输入:

在一行内输入a,b,c,d,m,b,所有的数值范围为【0-14】,本题为单组数据。

输出:

在一行内输出非降路径数。

例子输入:

0 0 1 1 2 2

例子输出:

4

#include <iostream>

using namespace std;



int Count(int n,int m)

{

    if(n==m||m==0)

        return 1;

    else

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

}



int main()

{

    int a,b,c,d,m,n,result1,result2,sum;

    cin>>a>>b>>c>>d>>m>>n;

    result1=Count(c-a+d-b,c-a);

    result2=Count(m-c+n-d,m-c);

    sum=result1*result2;

    cout<<sum<<endl;

    return 0;

}

在这道题目中,从(a,b)点到(c,d)点的非降路径数,就相当于从c-a+d-b个元素中选择c-a个元素的组合数,因为每一步只能向右或者向下走,所以总共需要走c-a+d-b步,其中有c-a步向右走。同理,从(c,d)点到(m,n)点的非降路径数,就相当于从m-c+n-d个元素中选择m-c个元素的组合数。所以,从(a,b)点经过(c,d)点到(m,n)点的非降路径数,就是这两个组合数的乘积。 

3. (程序题)简单组合:

计算C(n,m)的值,C(n,m)代表从n个元素中选取m个元素的方法数,其中有1<= m <= n<= 65。

输入:

输入数据有多组,每组数据一行,有2个整数分别为n和m。

输出:

输出从总共n个元素中选出m个元素共有多少种方法?

例子输入:

2 2

4 2

例子输出:

1

6

 一般解法

#include <iostream>

using namespace std;

long long  Count(long long n,long long m)

{

    if(n==m||m==0)

        return 1;

    else

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

}

int main()

{

long long n,m,result,sum;

while(cin>>n>>m)
{

    sum=Count(n,m);

    cout<<sum<<endl;

}

    return 0;

}

计算从n个元素中选取m个元素的组合数。它使用了递归的方法,利用了组合数的性质:

C_n^m=C_{n-1}^m+C_{n-1}^{m-1}

问题

上述代码中的 Count 函数使用了递归方式计算组合数,对于大的输入值可能会导致栈溢出或运行时间较长。对于较大的组合数计算,推荐使用动态规划或组合数公式进行计算。 

#include <iostream>
using namespace std;

long long combination(int n, int m) {
    long long dp[66][66] = {0};
    for (int i = 0; i <= n; i++) {
        dp[i][0] = 1;
        dp[i][i] = 1;
    }
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j < i; j++) {
            dp[i][j] = dp[i - 1][j] + dp[i - 1][j - 1];
        }
    }
    return dp[n][m];
}

int main() {
    int n, m;
    while (cin >> n >> m) {
        long long result = combination(n, m);
        cout << result << endl;
    }
    return 0;
}

dp 是一个二维数组,用于保存计算过程中的中间结果。dp[i][j] 表示从 i 个元素中选择 j 个元素的组合数。C_n^m=C_{n-1}^m+C_{n-1}^{m-1}

4. (程序题)小兔的棋盘

小兔的叔叔从外面旅游回来给她带来了一个礼物,小兔高兴地跑回自己的房间,拆开一看是一个棋盘,小兔有所失望。不过没过几天发现了棋盘的好玩之处。从起点(0,0)走到终点(n,n)的最短路径数是C(2n,n),现在小兔又想如果不穿越对角线(但可接触对角线上的格点),这样的路径数有多少?小兔想了很长时间都没想出来,现在想请你帮助小兔解决这个问题,对于你来说应该不难吧 !

输入:

多组输入,每次输入一个数n(1<=n<=35),当n等于-1时结束输入。

输出:

对于每个输入数据输出路径数,具体格式看Sample。

例子输入:

12

 -1

例子输出:

1 1 2 

2 3 10 

3 12 416024

#include <iostream>
using namespace std;

typedef long long LL;

LL a[71][71],i,j,n;



int main() {

  for(int i=0;i<=70;i++)
        a[i][i]=a[i][0]=1;

        for(i=2;i<=70;i++)

            for(j=1;j<=70;j++)
                a[i][j]=a[i-1][j-1]+a[i-1][j];

 int t=0;

 LL ans=0;

 while(cin>>n&&n!=-1)

    {

      t++;

      ans=a[2*n][n]*2;

      ans=ans/(n+1);

      cout<<t<<" "<<n<<" "<<ans<<endl;

    }



  return 0;

}

 

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

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

相关文章

springboot篮球论坛系统springboot034

大家好✌&#xff01;我是CZ淡陌。一名专注以理论为基础实战为主的技术博主&#xff0c;将再这里为大家分享优质的实战项目&#xff0c;本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#xff0c;希望你能有所收获&#xff0c;少走一些弯路…

渗透测试怎么入门?(超详细解读)

1. 什么是渗透测试 渗透测试就是模拟真实黑客的攻击手法对目标网站或主机进行全面的安全评估&#xff0c;与黑客攻击不一样的是&#xff0c;渗透测试的目的是尽可能多地发现安全漏洞&#xff0c;而真实黑客攻击只要发现一处入侵点即可以进入目标系统。 一名优秀的渗透测试工程…

ubuntu安装Miniconda并举例使用

更新系统包 sudo apt update sudo apt upgrade官网下载Miniconda&#xff0c;最好是实体机下载后放进虚拟机&#xff0c;方法可以参考Xftp 7连接服务器或者本地虚拟机文章 https://docs.conda.io/en/latest/miniconda.html#linux-installers 进入安装目录执行&#xff0c;右键…

行业追踪,2023-10-11

自动复盘 2023-10-11 凡所有相&#xff0c;皆是虚妄。若见诸相非相&#xff0c;即见如来。 k 线图是最好的老师&#xff0c;每天持续发布板块的rps排名&#xff0c;追踪板块&#xff0c;板块来开仓&#xff0c;板块去清仓&#xff0c;丢弃自以为是的想法&#xff0c;板块去留让…

什么是大数据,大数据简介

大数据的概念通俗的说法 大数据&#xff0c;按照我的理解比较通俗易懂的是在数据量很多很大的情况下数据处理速度需要足够快&#xff0c;用我们以前传统意义上的的技术比如关系型数据库mysql没办法处理或者处理起来非常复杂&#xff0c;必须有一些新的处理技术也就是大数据处理…

网工内推 | 实施工程师,有软考证书优先,上市公司,最高14薪

01 新点软件 招聘岗位&#xff1a;实施工程师 职责描述&#xff1a; 1、负责一线项目组对接&#xff0c;完成项目前期信息、需求收集&#xff1b; 2、负责需求验证、管控、上线专项跟进工作&#xff1b; 3、负责在推进过程中总结与沉淀&#xff0c;提升优化对接规范/效率&…

windows 下编译libcurl openssl

参考 编译libcurl-openssl 1、拉取opensssl 建议指定为最新的发布版本 git clone -b openssl-3.1.3 --recurse-submodules https://github.com/openssl/openssl.git2、拉取curl 建议指定为最新的发布版本 git clone -b curl-8_3_0 --recurse-submodules https://github.c…

WIPO绿色专利分类范围清单

WIPO绿色专利分类范围清单 1、来源&#xff1a;WIPO绿色专利分类范围清单来源于网址&#xff1a; https://www.wipo.int/classifications/ipc/green-inventory/home&#xff09; 2、范围&#xff1a;全球范围 3、指标为key、class、IPC、l1Title、l2Title、l3Title、l4Titl…

C进阶-自定义类型:结构体、枚举、联合

本章重点&#xff1a; 结构体&#xff1a; 结构体类型的声明 结构的自引用 结构体变量的定义和初始化 结构体内存对齐 结构体传参 结构体实现位段&#xff08;位段的填充&可移植性&#xff09; 1 结构体的声明 1.1 结构的基础知识 结构是一些值的集合&#xff0c;这些值称…

H3C交换机如何配置SSH服务

环境&#xff1a; H3C S6520 version 7.1.070, Release 6530P02 问题描述&#xff1a; H3C交换机如何配置SSH服务 组网需求 配置Host&#xff08;SSH客户端&#xff09;与Switch建立本地连接。Host采用SSH协议登录到Switch上&#xff0c;以保证数据信息交换的安全。SSH用…

深度学习_1_基本语法

数据结构 代码&#xff1a; import torchx torch.arange(12)##产生长度为12的一维张量print(x)##X x.resize(3, 4)##被弃用##print(X)y torch.reshape(x, (3, 4))##修改向量为矩阵&#xff0c;一维变二维print(y)print(y.size())xx torch.zeros((2, 3, 4))##三维矩阵&…

Ubuntu编译安装colmap遇到的几个问题以及解决

总体安装过程已经很明白了&#xff0c;写的人很多了&#xff0c;我就不赘述了&#xff0c;可以参考这里或者其他博客。我主要记录几个我遇到的问题以及解决方法。 1、cmake报错&#xff1a;No CMAKE_CUDA_COMPILER could be found. 这个原因是没找到cuda和nvcc目录&#xff0…

项目经理必看!4个万能公式,轻松搞定即兴发言!

大家好&#xff0c;我是老原。 项目经理经常会遇到一些需求会、演讲等需要开口发言的场合&#xff0c;而且大多数都挺突然的。 你永远不知道自己会在什么情况下&#xff0c;就被cue起来说两句。 可能是临时汇报&#xff1b; 也可能是开会时&#xff0c;领导突然询问你的意见…

单目标应用:遗传算法(Genetic Algorithm,GA)求解微电网优化MATLAB

一、微网系统运行优化模型 微电网优化模型介绍&#xff1a; 微电网多目标优化调度模型简介_IT猿手的博客-CSDN博客 二、遗传算法GA 遗传算法&#xff08;Genetic Algorithm&#xff0c;GA&#xff09;起源于对生物系统所进行的计算机模拟研究&#xff0c;是一种随机全局搜索…

项目接口请求合并

请求合并到底有什么意义呢&#xff1f;我们来看下图。 假设我们3个用户&#xff08;用户id分别是1、2、3&#xff09;&#xff0c;现在他们都要查询自己的基本信息&#xff0c;请求到服务器&#xff0c;服务器端请求数据库&#xff0c;发出3次请求。我们都知道数据库连接资源是…

PO、DTO、VO、BO到底是什么用在哪一层

简介 PO &#xff08;Persistant Object&#xff09;&#xff1a;此对象与数据库表结构一一对应&#xff0c;通过 DAO 层向上传输数据源对象。DTO&#xff08;Data Transfer Object&#xff09;&#xff1a;数据传输对象&#xff0c;Service 或 Manager 向外传输的对象。BO&a…

linux C++ vscode连接mysql

1.linux使用Ubuntu 2.Ubuntu安装vscode 2.1 安装的是snap版本,直接打开命令行执行 sudo snap install --classic code 3.vscode配置C 3.1 直接在扩展中搜索C安装即可 我安装了C, Chinese, code runner, 安装都是同理 4.安装mysql sudo apt update sudo apt install mysql-…

【算法】双向冒泡排序

// // Created by Lunau on 2023/10/11. // #include<stdio.h> #include <cstdlib>void swap(int &i,int &j) {int tp i;i j;j tp; }/*** 双向冒泡排序&#xff0c;采用双指针* param arr* param len*/ void Sort(int arr[], int len) {int p0, q len-…

干货!SRC漏洞挖掘项目实战经验分享

目录 一、hunter上搜索web.title”nacos”&#xff0c;查找中国境内的资产&#xff0c;定位到两个地址。 二、访问一下8086端口&#xff0c;界面很明显是nacos&#xff0c;直接抓包&#xff0c;创建用户。 三、登录网站&#xff0c;里面看到配置管理。 四、查看下redis.yml…

驾驶数字未来:汽车业界数字孪生技术的崭新前景

随着数字化时代的到来&#xff0c;汽车行业正经历着前所未有的变革。数字孪生技术&#xff0c;作为一种前沿的数字化工具&#xff0c;正在为汽车行业带来革命性的影响&#xff0c;不仅改变着汽车制造和维护的方式&#xff0c;也为消费者带来了前所未有的体验。让我们一起探讨&a…