原题链接:蓝桥杯算法提高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、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复