1664:放苹果。考点:逻辑思维

原题:http://bailian.openjudge.cn/practice/1664/

描述

把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。

输入

第一行是测试数据的数目t(0 <= t <= 20)。以下每行均包含二个整数M和N,以空格分开。1<=M,N<=10。

输出

对输入的每组数据M和N,用一行输出相应的K。

样例输入

1
7 3

样例输出

8 

解法

这道题关键在于理解它的思维逻辑,不然算不出来。理解了以后有两种实现方式。大同小异。

第一种是递归

 1 #include <iostream>
 2 using namespace std;
 3 int appleways(int m, int n)
 4 {
 5     if (m == 0)return 1;
 6     if (n == 0)return 0;
 7     if (n > m)return appleways(m, m);
 8     int tmp = appleways(m, n - 1);
 9     return tmp + appleways(m - n, n);
10 }
11 int main()
12 {
13     int t;
14     cin >> t;
15     while (t--)
16     {
17         int M, N;
18         cin >> M >> N;
19         cout << appleways(M, N) << endl;
20     }
21     return 0;
22 }

第二种是结构体或者类+栈,关键在于栈,相当于用栈来模拟递归。后续会补充说明

 1 #include <iostream>
 2 #include <stack>
 3 using namespace std;
 4 struct Apple {
 5     int m;//apples
 6     int n;//plates
 7     Apple(int a,int b):m(a),n(b){}
 8 };
 9 int main()
10 {
11     int t;
12     cin >> t;
13     while (t--)
14     {
15         stack<Apple>ways;
16         int M, N, result = 0;
17         cin >> M >> N;
18         ways.push(Apple(M, N));
19         while (!ways.empty())
20         {
21             Apple nows = ways.top();
22             ways.pop();
23             if (nows.m == 0)result += 1;
24             else if (nows.n == 0)result = result;
25             else if (nows.n > nows.m)
26             {
27                 ways.push(Apple(nows.m, nows.m));
28             }
29             else {
30                 ways.push(Apple(nows.m - nows.n, nows.n));
31                 ways.push(Apple(nows.m, nows.n - 1));
32             }
33         }
34         cout << result << endl;
35     }
36     return 0;
37 }

 

posted @ 2021-07-03 14:32  永远是个小孩子  阅读(58)  评论(0编辑  收藏  举报