解题思路:  数学模型:看成 有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;}
点赞(1)
 

0.0分

5 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 2 条评论

coder 2年前 回复TA
can'nt AC
追猫的熊 4年前 回复TA
你好我有点没看懂.我强行理解,怎么感觉3的分法是每个篮放至少两个和有个篮只放一个