用c语言实现排列组合问题(华为软件面试试题之一)

有m个篮子,每个篮子可以装n个球,现在共有x个球,球是完全相同的。问有多少种放法?(用c语言编程实现,只要做出数学揭发就可给分)(我觉得应该分x<n和大于等于n讨论)... 有m个篮子,每个篮子可以装n个球,现在共有x个球,球是完全相同的。问有多少种放法?(用c语言编程实现,只要做出数学揭发就可给分)
(我觉得应该分x<n和大于等于n讨论)
展开
 我来答
georangel
2009-04-20 · TA获得超过541个赞
知道小有建树答主
回答量:319
采纳率:0%
帮助的人:360万
展开全部
/* 算法 */
// 从剩余的nM个篮子里空出nX = m*n - x;个球
int GetBall(int nX, int nM, int n) {
  int nA;
  int nS = 0;
/* 如果这次情况里确定从一个篮子里空出球 */
  // 如果nM等于1 返回 1;
  if (nX <= n) {
/* 最少从一个篮子里拿走,最多必须从 nM 与 n 中 较少个数的篮子里拿走 */
    // 当nA从 1 增加到 nX,循环执行下行语句
      nS += GetBall(nA,1,n) + GetBall(nX-nA,nM-1,n);
    // 返回 nS;
  } else if (nX > n) {
/* 1. 知道剩下的篮子数目nM,2. 可以保证nX-nA <= nM*n */
    // 当nA从 n 减少到 nX-n*nM,循环执行下行语句
      nS += GetBall(nA,1,n) + GetBall(nX-nA,nM-1,n);
    // 返回 nS;
  }
}

int main() {
  int m,n,x;
  m = 5; n = 6; x = 22;
  printf("%d\n",GetBall(m*n-x, m, n));
  return 0;
}
vbtraz
2009-04-19 · TA获得超过5532个赞
知道大有可为答主
回答量:4152
采纳率:0%
帮助的人:4432万
展开全部
这里把所有的篮子当作是等价的,也就是 一个球放在哪个篮子都是同一种放法。 如果不是这样的话就麻烦了。。

int Situations(int m, int n, int x)
{
if (x < 0) return 0;
if (x == 0) return 1;
if (n*m == 0) return 0;
return Situations(m-1,n,x) + Situations(m, n-1, x-m);
}

int main()
{
int m, n, x;
scanf("%d %d %d", &m, &n, &x);
printf("%d\n", Situations(m,n,x));
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
梦想窗外
2009-04-21 · TA获得超过1588个赞
知道大有可为答主
回答量:1180
采纳率:0%
帮助的人:1560万
展开全部
过来看看。。。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
pujia12345
2009-04-19 · TA获得超过3680个赞
知道大有可为答主
回答量:3456
采纳率:0%
帮助的人:2969万
展开全部
篮子一样???
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
帅建郝雪卉
2019-11-30 · TA获得超过3696个赞
知道大有可为答主
回答量:3155
采纳率:28%
帮助的人:199万
展开全部
/*
算法
*/
//
从剩余的nM个篮子里空出nX
=
m*n
-
x;个球
int
GetBall(int
nX,
int
nM,
int
n)
{
  int
nA;
  int
nS
=
0;
/*
如果这次情况里确定从一个篮子里空出球
*/
  //
如果nM等于1
返回
1;
  if
(nX
<=
n)
{
/*
最少从一个篮子里拿走,最多必须从
nM

n

较少个数的篮子里拿走
*/
    //
当nA从
1
增加到
nX,循环执行下行语句
      nS
+=
GetBall(nA,1,n)
+
GetBall(nX-nA,nM-1,n);
    //
返回
nS;
  }
else
if
(nX
>
n)
{
/*
1.
知道剩下的篮子数目nM,2.
可以保证nX-nA
<=
nM*n
*/
    //
当nA从
n
减少到
nX-n*nM,循环执行下行语句
      nS
+=
GetBall(nA,1,n)
+
GetBall(nX-nA,nM-1,n);
    //
返回
nS;
  }
}
int
main()
{
  int
m,n,x;
  m
=
5;
n
=
6;
x
=
22;
  printf("%d\n",GetBall(m*n-x,
m,
n));
  return
0;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式