原题链接:蓝桥杯算法提高VIP-数的划分
解题思路: 数学模型:看成 有n个球要放到k个盒子里,变化的是(盒子)k的数目。 1。如果盒子数为1或者n,都只有1种方法 2.如果球数小于盒子数,必定有n-k个盒子为0,去掉这些盒子也没影响,即fun(n,n) 所以可直接返回0 3.最重要的地方!! 如果球数大于盒子数 分为两种情况! 第一:所有盒子都放了球,则可以相当于把所有盒子都取出一个球,方案数不变 即为fun(n-k,k) 第二:至少有一个盒子为空格 fun(n-1,k-1)
注意事项:
参考代码:
#include<iostream> using namespace std; int count=0,n; const int N=105; long long book[N][N];//用于标记 long long fun(int m,int k){ if(book[m][k]!=0) return book[m][k]; //如果是已经标记过的情况,直接返回 if(m<k) return 0; if(k==1||m==k) return 1;//k=1即分一组,就只有n。 m==k表示每个组为1 return book[m][k]=fun(m-k,k)+fun(m-1,k-1); } //两种情况 int main(){ cin>>n; int i; for(i=1;i<=n;i++) count+=fun(n,i); cout<<count; return 0;}
0.0分
5 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复