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 }