竞赛
考级
1.如果盘子数比苹果数多,那么即使我们讲苹果拆成一个一个放,我们也注定会有一些盘子是空的,所以我们直接排除掉这些空盘子。即: if(n > m){ return(f(m,m)); } 2.放苹果是可以分开考虑是放满每一个盘子还是空一个盘子。如果是全放满则是f(m-n,n),如果空一个盘子就是f(m,n-1). 3.如果盘子或者苹果只有一个,那么只有一种方法,直接return 1.
风虽
者仇复
【深搜】 递归搜索盘子的使用情况,建立如下递归搜索树 【代码如下】 记录上一个盘子的苹果数,本次放置的苹果不小于上一个。保证不重复
路小凤
༺ཌༀ元气满满ༀད༻
轩至洛阳
#include<bits/stdc++.h> using namespace std; int fun(int m,int n){ if(n<=1||m<=1)return 1; if(m<n)return fun(m,m); return fun(m-n,n)+fun(m,n-1); } int main(){ int m,n,t; cin>>t; for(int i=0;i<t;i++){ cin>>m>>n; cout<<fun(m,n)<<endl; }
阿兹卡班
#include<bits/stdc++.h> using namespace std; int fun(int m,int n){ if(n<=1||m<=1)return 1; if(m<n)return fun(m,m); return fun(m-n,n)+fun(m,n-1); } int main(){ int m,n,t; cin>>t; for(int i=0;i<t;i++){ cin>>m>>n; cout<<fun(m,n)<<endl; } }
梓恩
#include<bits/stdc++.h> using namespace std; int t; long long n,k; long long hf(long long x,long long y){ if(x0||y1){ return 1; } if(y==0){ return 1; } if(x<y){ return hf(x,x); } return hf(x,y-1)+hf(x-y,y); } int main() { cin>>t; for(int i=1;i<=t;i++){ cin>>n>>k; cout<<hf(n,k)<<endl; } return 0; }
编程之神
递归逻辑如下:\color{red}{递归逻辑如下:}递归逻辑如下: 1.\color{blue}{1.}1. 如果没有苹果了或者没有盘子了,没有分法,直接return 0; 2.\color{blue}{2.}2. 如果只有一个盘子或只有一个苹果,只有一种分法(因为不考虑顺序),return 1; 3.\color{blue}{3.}3. 如果盘子数量为 222 ,则放法数量为 m/n+1m/n+1m/n+1 (此处为整除)(我研究的规律你们自己去试) 4.\color{blue}{4.}4. 剩下的情况,如果 m>nm>nm>n ,则有两种情况,空一个盘子不放,或每个盘子放一个苹果(若放完后的苹果数量比盘子数量少,盘子数量应减少),return f(m,n-1)+f(m-n,min(m-n,n)); 5.\color{blue}{5.}5. 如果 m==nm==nm==n ,也有两种情况,空一个盘子不放,或每个盘子放一个(这种情况苹果放完了,再递归下去还会return 0;没有意义,return f(m,n-1)+1; 6.\color{blue}{6.}6. 如果 m<nm<nm<n 不管怎么放至少有 m−nm-nm−n 个盘子空着,只剩 mmm 个盘子,所以return f(m,m); C++ Code:
skirmish