计蒜客T1208 放苹果

    科技2022-07-11  98

    这道题可以用动态规划来解,也可以递归来做。

    递归: (m,n)代表m个苹果分在n个盘子里的分法,这里分三种情况:

    没有苹果或只有一个盘子时,(m=0||n==1)只有一种分法。第二种是苹果的数量小于盘子的数量(m<n),这时候的分法等于(m,n)=(m,m),就像3个苹果分在5个盘子里的分法等于3个苹果在3个盘子的分法;第三种情况是苹果的数量大于等于盘子的数量,这里可以拿有没有盘子进行讨论: 如果没有空盘子,那每个盘子减去一个苹果和不减去一个苹果的分法是一样的,即(m,n)=(m-n,n)。就像7个苹果分3个盘子里,如果没有空盘子,那么三个盘子的苹果为1+x,1+y,1+z。这里面x+y+z=4。这就相当于4个苹果在3个盘子里面分,即(m,n)=(m-n,n)。 有空盘子时,(m,n)=(m,n-1),每次递归的时候就减少一个盘子来算,比如,5个苹果放3个盘子里,如果有空盘子,这个问题就等价于5个苹果放2个盘子里。

    AC代码:

    #include<iostream> #include<algorithm> using namespace std; int Put(int m,int n){ if(m==0) return 1;//没有苹果 if(n==1) return 1;//只有一个盘子 if(m<n) return Put(m,m);//苹果数<盘子数 else{ //苹果数>=盘子数 //分为不是所有盘子都有苹果(有一个空盘子),以及所有盘子都有苹果(每个盘子里肯定有一个苹果) return Put(m,n-1)+Put(m-n,n); } } int main(){ int t; cin>>t; while(t--){ int m,n; cin>>m>>n; cout<<Put(m,n)<<endl; } return 0; }

    动态规划解法见大佬博客:https://blog.csdn.net/weixin_44820625/article/details/104226272

    Processed: 0.016, SQL: 8