题解 | #放苹果#
放苹果
http://www.nowcoder.com/practice/bfd8234bb5e84be0b493656e390bdebf
C++实现,解题思路主要分为两点:1、将本题转化为递归去解决;2、递归的代码实现,找到递归终止条件 1、放苹果问题可以分为两种情况,当苹果数m小于盘子数n时,多余的盘子没有用,对于排列的种类数量没有影响,可以令n=m; 当苹果数大于等于盘子数时,以盘子数i=1:n为循环放苹果,即i个盘子里至少有1苹果; 此时问题简化为了,m-i个苹果放在i个盘子里的问题,调用自身递归 2、找到递归的终止条件:当盘子n=1时只有一种情况,即所有苹果放1个盘子里,排列组合总数+1; 当苹果m=1时,不管盘子有多少,只能放任意一个,排列组合数+1; 当苹果m=0时,空盘放置,排列组合数+1;
#include<iostream> using namespace std; int num=0; //定义全局变量,记录排列组合数 void Ways(int a,int b) { if(a<b) b=a; if(a==1||b==1||a==0){ num++; return; } for(int i=1;i<=b;++i) Ways(a-i, i); return; } int main() { int m=0,n=0; while(cin>>m>>n) { Ways(m, n); cout<<num<<endl; num=0; } return 0; }