思路

  1. 分组问题,要是找不到dp的状态转移,或者数学递归规律,首选dfs
    #include<iostream>
    #include<set>
    #include<string>
    #include<string.h>
    #include<algorithm>
    using namespace std;
    int visited[10];
    set<string> se;
    int m, n;
    void dfs(int apple, int plate)
    {
     if (apple ==0)/*中止条件*/
     {
         string str;
         for (int k = 0; k < n; k++)/*这个变成字符串方便去重*/
         {
             str += to_string(visited[k]);
         }
         sort(str.begin(), str.end());
         se.insert(str);/*set去重*/
         return ;
     }
     if (plate >=n) return ;/*防止有苹果没有放完的情况,苹果没有放完,但没有盘子了*/
     for (int i = 0; i <=apple; i++)/*遍历所有盘子的苹果数*/
     {
         visited[plate]=i;/*保存每个盘子放的苹果数*/
         dfs(apple - i, plate +1);/*递归*/
         visited[plate] = 0;/*回溯*/
     }
    }
    int main()
    {
     while (cin>>m>>n)
     {
         if (!(0 < m && m <= 10) || !(1 <= n && n <= 10))
             return -1;
         dfs(m, 0);
         cout << se.size() << endl;
         se.clear();
         memset(visited, 0, sizeof(visited));
     }
    

}
```