回溯与搜索 五 数的划分(NOIP2001)

简介: 回溯与搜索 五 数的划分(NOIP2001)

数的划分(NOIP2001)

【问题描述】

将整数n分成k份,且每份不能为空,任意两种分法不能相同(不考虑顺序)。

例如:n=7,k=3,下面三种分法被认为是相同的。     1,1,5;     1,5,1;    5,1,1;

问有多少种不同的分法。

【输入格式】

n,k      (6<n≤200,2≤k≤6)

【输出格式】

一个整数,即不同的分法。

【输入样例】    

7 3

【输出样例】

4

{4种分法为:1,1,5;1,2,4;1,3,3;  2,2,3 说明部分不必输出}

1. //回溯 递推 全排列 超时
2. #include<iostream>
3. #include<cstdio>
4. #include<iomanip>
5. using namespace std;
6. int n,k,sum=0;
7. int s[8]={0}; 
8. int main()
9. {
10.   cin>>n>>k;
11.   int i=1;
12.   while(i){
13.     s[i]++;
14.     if(s[i]>n) i--;
15.     else if(i==k){
16.       int su=0;
17.       for(int j=1;j<=k;j++) su+=s[j];
18.       if(n==su) sum++;
19.     }
20.     else{
21.       i++;
22.       s[i]=s[i-1]-1;  
23.     }
24.   }
25.   cout<<sum;  
26.   return 0;
27.  }
1. //递归法
2. #include<iostream>
3. #include<cstdio>
4. #include<iomanip>
5. using namespace std;
6. int n,k;
7. int fin(int a,int b,int c)
8. {
9.  int sum=0;
10.   if(b==1) sum=1;
11.   else {
12.     for(int i=c;i<=a/b;i++)
13.       sum+=fin(a-i,b-1,i);
14.   } 
15.   return sum;
16. }
17. int main()
18. {
19.   cin>>n>>k;
20.   cout<<fin(n,k,1);
21.   return 0;
22.  }
1. //动态穷举 剪枝 
2. #include<iostream>
3. #include<cstdio>
4. #include<iomanip>
5. using namespace std;
6. int n,k,sum=0;
7. int min(int x,int y)
8. {
9.  if(x<y) return x;
10.   else return y;
11. }
12. void work(int a,int b,int c)
13. {
14.   int i;
15.   if(a==0) sum++;
16.   else {
17.     for(i=min(b-a+1,c);i>=b/a;i--)
18.       work(a-1,b-i,i);
19.   }
20. }
21. int main()
22. {
23.   cin>>n>>k;
24.   work(k,n,n);
25.   cout<<sum;
26.   return 0;
27.  }
1. //递推 找到递推方程 
2. #include<iostream>
3. #include<cstdio>
4. #include<iomanip>
5. using namespace std;
6. int n,k;
7. int s[201][7]={0}; 
8. int main()
9. {
10.   cin>>n>>k;
11.   s[0][0]=1;
12.   for(int i=1;i<=n;i++) s[i][1]=1;
13.   for(int i=1;i<=n;i++)
14.     for(int j=2;j<=(min(i,k));j++)
15.       for(int t=1;t<=(min(i,j));t++)
16.         s[i][j]+=s[i-t][min(i-t,t)];
17.   cout<<s[n-k][k];
18.   return 0;
19.  }

 

相关文章
|
缓存 监控 前端开发
【Flutter 前端技术开发专栏】Flutter 应用的启动优化策略
【4月更文挑战第30天】本文探讨了Flutter应用启动优化策略,包括理解启动过程、资源加载优化、减少初始化工作、界面布局简化、异步初始化、预加载关键数据、性能监控分析以及案例和未来优化方向。通过这些方法,可以缩短启动时间,提升用户体验。使用Flutter DevTools等工具可助于识别和解决性能瓶颈,实现持续优化。
476 0
【Flutter 前端技术开发专栏】Flutter 应用的启动优化策略
阿里云域名收费标准(com/cn等不同后缀价格表)
阿里云域名多少钱一年?阿里云域名价格?域名后缀不同新注册价格、续费价格及转入价格也不同
|
11月前
|
弹性计算 安全 网络安全
阿里云服务器租用流程,四种阿里云服务器租用方式图文教程参考
阿里云服务器可以通过自定义租用、一键租用、云市场租用和活动租用四种方式去租用,不同的租用方式适合不同的用户群体,例如我们只是想租用一款配置较低且可以快速部署应用的云服务器,通常可以选择一键租用或者云市场租用,本文为大家展示不同租用方式的适合对象以及租用流程,以供初次租用阿里云服务器的用户参考和选择。下面是阿里云服务器租用的图文操作步骤。
11341 2
|
消息中间件 存储 Java
RabbitMQ之延迟队列(手把手教你学习延迟队列)
【1月更文挑战第12天】延时队列,队列内部是有序的,最重要的特性就体现在它的延时属性上,延时队列中的元素是希望在指定时间到了以后或之前取出和处理,简单来说,延时队列就是用来存放需要在指定时间被处理的元素的队列的。
4759 104
|
算法
常用的简单校验算法:校验和,异或校验,crc校验,LRC校验,补码求和,checksum
常用的简单校验算法:校验和,异或校验,crc校验,LRC校验,补码求和,checksum
2412 1
|
算法 NoSQL 网络协议
嵌入式软件开发应该掌握哪些知识?
本文介绍了嵌入式软件及其在汽车、医疗设备等领域的应用。嵌入式软件是运行在嵌入式系统中的程序,负责控制硬件并提供特定功能。要成为嵌入式软件开发者,需掌握C/C++编程语言、数据结构与算法、Linux基础知识,如文件系统管理、命令操作。进阶知识包括文件I/O、线程进程、IPC和网络编程。高阶知识涉及ARM架构、系统移植、Bootloader、内核移植及Linux驱动开发,包括设备驱动编程和调试优化技术。
338 0
|
存储 数据库 索引
LSM(Log-Structured Merge-tree
在数据库领域,LSM(Log-Structured Merge-tree)是一种非常高效的数据存储方式。它通过将数据分层存储,并使用跳表(SkipList)等数据结构,实现了快速的数据查找和更新。
237 1
|
Linux Shell 开发工具
Git 安装和配置教程:Windows - Mac - Linux 三平台详细图文教程,带你一次性搞 Git 环境
Git是一款免费、开源的分布式版本控制系统,广泛应用于软件开发领域。随着开源和云计算的发展,Git已经成为了开发者必备的工具之一。本文将为大家介绍Git在Windows、Mac和Linux三个平台上的安装和配置方法,带你一次性搞定Git环境
4216 0