问题标题: 酷町堂1240 放梨子

0
0

0
已采纳
张睿杰
张睿杰
初级天翼
初级天翼
int up(int m,int n)
{
    if(m==0||n==1) return 1;
    else if(m<n) return up(m,m);
    else return up(m-n,n)+up(m,n-1);
}

然后主程序里面

定义整形m,n;
输入m,n
输出up(m,n)

别忘了声明函数

张睿杰在2018-01-26 16:02:25追加了内容

顺便告诉你2182 放橘子和这个差不多

主程序改一下

int t,k,a[21];
    int m,n;
    cin>>t;
    k=t;
    while(t--)
    {
        cin>>m>>n;
        a[t]=up(m,n);
    }
    while(k--) cout<<a[k]<<endl;

 

1
杨喆
杨喆
初级守护
初级守护

搜索的函数有三个参数,第一参数n表示还有多少数需要分,第二个参数k表示分了第几个数了,第三个参数t表示当前应该从哪个数开始遍历。因为不允许重复,所以第三个参数的主要作用就是传上一次填的数,然后从这个数开始遍历,就保证新填的数比之前的大。

所以主函数一开始调用(n,k,1)

0
栾峻岩
栾峻岩
初级天翼
初级天翼

根据自然数的拆分那一题,把那个数拆成m份,判断输出时是t==m+1,最后ans要加1(自己)。

0
0
陈泉宏
陈泉宏
高级守护
高级守护
void dfs(int p,int q)
{
    int i;
    for(i=a[q-1];i<=p;i++)
    {
        if(i<n)
        {
            a[q]=i;
            p-=i;
            if(p==0&&q<=m)s++;
            else dfs(p,q+1);
            p+=i;
        }
    }
}

 

我要回答