原题链接:信息学奥赛一本通T1440-数的划分
解题思路:
将整数n分为k份,任意两份不能相同,而言,我们只需要保证这k个数,每个数都要大于等于前一个数即可。
注意事项:
int a[100]={1};//数组,存放每个值 int n,z;全局变量,方便函数使用 int ans=0;//记录符合条件的组合数
int search(int s,int t){ int i; for(int i=a[t-1];i<=s;i++){//i=a[t-1],即是等于前一个数,从前一个数开始遍历。 if(i<n){//从这个条件看,仿佛我们只满足了小于n,并没有满足小于s,实际上,我们for循环就将小于s的进行了筛选。 a[t]=i; s-=i; if(s==0&&t==z) ans+=1;//如果s=0并且t=z,就是满足了题目的要求,将整数n分为k份。 else if(t<z&&s>0) search(s,t+1);//需要继续进行搜索的条件 s+=i;//回溯。 } } } 此算法还可以用于,按照字典从小到大输出。因为是从小到大遍历的。
参考代码:
#include<bits/stdc++.h> using namespace std; int a[100]={1}; int n; int ans=0; int z; int search(int s,int t){ int i; for(int i=a[t-1];i<=s;i++){ if(i<n){ a[t]=i; s-=i; if(s==0&&t==z) ans+=1; else if(t<z&&s>0) search(s,t+1); s+=i; } } } int main(){ cin>>n>>z; search(n,1); cout<<ans; return 0; }
0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复