首页 > 其他分享 >蓝桥杯-数的划分(DFS)

蓝桥杯-数的划分(DFS)

时间:2024-04-26 23:57:17浏览次数:32  
标签:int sum 个数 dfs 蓝桥 划分 DFS 分配

0.题目

问题描述

  将整数n分成k份,且每份不能为空,任意两份不能相同(不考虑顺序)。
  例如:n=7,k=3,下面三种分法被认为是相同的。
  1,1,5; 1,5,1; 5,1,1;
  问有多少种不同的分法。
  

输入格式

n,k
  

输出格式

一个整数,即不同的分法
  

样例输入
7 3

样例输出
4

数据规模和约定
6<n<=200,2<=k<=6

1.题解

1.1 DFS暴力搜索+剪枝

思路

这里自上而下,一个数一个数的确定,每个数大于他前一个数。
记录位数,和,前置值
1.位数用于判断最终选择到了k个数
2.和用于判断结果是否满足n
3.前置值用于剪枝,

代码

#include<bits/stdc++.h>
using namespace std;
int n, k;
int ans = 0;
void dfs(int x, int sum, int pre) {
	if(x == k) {
		if(sum == n)
			ans++;
		return;
	}
	// 这里除去之前sum中的x个,自己的一个。剩余k - x - 1个,我们可以计算出当前值最大可能值(每个均不为空) 
	// 由于禁止重复,我们按从小到大的方向前行,后面的必须大于等于前面的就不会重复了 
	for(int i = pre; i <= n - sum - (k - x - 1) * pre; i++) {
		dfs(x+1, sum+i, i);
	}
}
int main() {
	cin >> n >> k;
	dfs(0, 0, 1);
	cout << ans;
	return 0;
}

1.2 划分+递归

思路

明确dfs函数的定义!!!即将n个数划分给m个数
所以截止条件就比较明确了,这里又分为结束的合理情况和不合理情况
1.先判断不合理情况,给下面的合理情况做一波排除: 1.1 n == 0(不可能将0个数分配给其他任意个数的人) 1.2 m0(至少要分配给一个人) 1.3 n<m(不够分配了,一次分配至少要m个) 其实1.1和1.2均可以通过2.中的合理条件排除,这里为了方便理解,也就写了出来(可以省略写前两个条件)
2.合理情况:m
1(剩下的全部分配给该人); n==m(由于一次分配至少要分配m个,刚好全部分配)

主要划分为两种情况,均针对当前还在变化的首位数:
1.如果继续增加(不选择1),那就是给所有人均分配一个,然后继续给m个人分配 dfs(n-m,m)
2.如果不继续增加(选择1), 那就是给他分配一个,之后的n-1个留给m-1个人继续分配 dfs(n-1,m-1)

代码

#include<bits/stdc++.h>
using namespace std;
// 将n划分给m个数(每个至少为1,因为后面的总要大于前面的,前面第一个分了,后面就都至少要分1个),一定要先明确递归函数的定义!!!
int dfs(int n, int m) {
	// 不合理条件: 1. n<m(不够分); 2.m==0,没有对象给予了 3. n==0没有数分
	if (n < m || m == 0 || n == 0) return 0;
	// 合理结束条件: 1.n == m(刚好够一次分的) 2.m==1, 全分给剩下的这个
	if (n == m || m == 1) return 1;

	// 如果不选择 1, 就每个人都分一个1, 然后将剩下的 n-m个再分配给 m个人
	// 如果选择某个层级首个位置固定为1(之后不再选择), 那么就将剩下的 n-1个再分配给剩下的 m-1个人
	return dfs(n-m,m) + dfs(n-1,m-1);
}
int main() {
	int n, k;
	cin >> n >> k;
	cout << dfs(n, k);
	return 0;
}

标签:int,sum,个数,dfs,蓝桥,划分,DFS,分配
From: https://www.cnblogs.com/trmbh12/p/18125483

相关文章

  • 深度优先搜索 Depth First Search (DFS)
    本篇篇幅较长,请做好心理准备!共三章节:1.深搜入门(一维方向数字选数类)2.深搜入门(二维方向迷宫类)3.深搜进阶(迷宫类问题--最少步数和输出路径)第一章:深搜入门(一维方向数字选数类)前置知识:函数、递归为了保证学习效果,请保证已经掌握前置知识之后,再来学习本章节!深度优......
  • 36天【代码随想录算法训练营34期】第八章 贪心算法 part05( ● 435. 无重叠区间 ● 7
    435.无重叠区间classSolution:deferaseOverlapIntervals(self,intervals:List[List[int]])->int:count=0intervals.sort(key=lambdax:x[0])foriinrange(1,len(intervals)):ifintervals[i][0]<intervals[i-......
  • [IOI2019] 景点划分
    令人忍俊不禁的是,11月的模拟赛出现了“摩拉克斯”一题,被取之。2月JOISC出现这个模型,被取之。2月模拟赛出现这个模型,被取之。本题再次出现这个模型,被取之。呃呃呃呃呃呃呃呃呃啊。首先进行一些简单的分析:令\(A\leB\leC\),构造\(A,B\)合法的情况即可。并且有\(A\len/......
  • 利用 Amazon EMR Serverless、Amazon Athena、Apache Dolphinscheduler 以及本地 TiDB
    引言在数据驱动的世界中,企业正在寻求可靠且高性能的解决方案来管理其不断增长的数据需求。本系列博客从一个重视数据安全和合规性的B2C金融科技客户的角度来讨论云上云下混合部署的情况下如何利用亚马逊云科技云原生服务、开源社区产品以及第三方工具构建无服务器数据仓库的解......
  • 数据结构与算法学习(1)——DFS(深度优先搜索)
    DFS基础深度优先搜索算法(英语:Depth-First-Search,缩写为DFS)是一种用于遍历或搜索树或图的算法。这个算法会尽可能深地搜索树的分支。当节点v的所在边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发......
  • 分布式文件系统FastDFS安装教程
     转载链路地址https://www.cnblogs.com/handsomeye/p/9451568.html  前言centos7x642009、vmware16pro(网络仅主机模式)安装libfastcommon获取libfastcommon安装包:wgethttps://github.com/happyfish100/libfastcommon/archive/V1.0.38.tar.gz解压安......
  • 2024蓝桥杯省赛C/C++程序设计A组题目简析
    2024蓝桥杯省赛C/C++程序设计A组题目简析A题意:计算一段区间内日期的中文表达的总笔画数>50的天数按照题意枚举即可。注意个位数字前面需要加一个“零”,也就是多13笔。B题意:\(5\times5\)的棋盘下五子棋,最终下满棋盘并和棋的情况数dfs或者遍历二进制去枚举棋子位置的情况均可......
  • DFS+余数运用
    链接:https://ac.nowcoder.com/acm/contest/77231/C来源:牛客网时间限制:C/C++1秒,其他语言2秒空间限制:C/C++262144K,其他语言524288KSpecialJudge,64bitIOFormat:%lld题目描述小红来到了红魔馆。众所周知,红魔馆的馆主是一只495岁的吸血鬼,所以她非常喜欢495这个数。......
  • 用海豚调度器定时调度从Kafka到HDFS的kettle任务脚本
    在实际项目中,从Kafka到HDFS的数据是每天自动生成一个文件,按日期区分。而且Kafka在不断生产数据,因此看看kettle是不是需要时刻运行?能不能按照每日自动生成数据文件?为了测试实际项目中的海豚定时调度从Kafka到HDFS的Kettle任务情况,特地提前跑一下海豚定时调度这个任务,看看到底什么......
  • 【2024蓝桥B组】好数
    好数题目 题目分析1.蓝桥杯不怕麻烦的,一般可以选择用longlongint替换int,防止数据过大2.这道题不怕麻烦的话,可以直接暴力解,用多个if语句进行判断即可3.想要美观点的,就进行数位判断4.这道题就一个关键点:奇数位对奇数,偶数位对偶数代码1#include<iostream>usingname......