m个人分成n组,要求每组最少一个人,如何用C语言编程求所有可能的解?

RT。要求结果是第一个组1人,第二个组1人……第n个组多少人。... RT。要求结果是 第一个组1人,第二个组1人……第n个组多少人。 展开
 我来答
sputnik_lovers
推荐于2018-03-23
知道答主
回答量:4
采纳率:0%
帮助的人:5.6万
展开全部

数学上可以用排列组合的方法,隔板法来求解,前提是人之间没有差别,如果人数大于分组数,那么就相当于将n-1个隔板插进m-1个人之间,解的个数用排列组合的C运算来求,比如说三个人分两组,那么解的个数为2X1/1=2,如果五个人分三组,那么解的个数为5X4X3/(3X2X1)=10;

如果用程序实现,可以采用递归调用加指针,我的算法有点麻烦,可能还有更简单的:

#include "stdafx.h"

int m,n;

int *a;

int *ini;

void main()

{

    void allocate(int q,int r);

    while(true)

    {

        scanf("%d",&m);

        scanf("%d",&n);

        if(m>=n)

        {

            break;

        }

        else

        {

        printf("请重新输入\n");

        }

    }

    a = (int*)malloc(n*sizeof(int));

    ini=a;

    for(int i=0;i<n;i++)

    {

        *(a++)=1;

    }

    a=ini;

    allocate(0,n);

}

void allocate(int q,int r)

{

    int sum=0;

    int next;

    if(q>=r)

    {

        q=r-1;

        a=ini;

        for(int j=0;j<r;j++)

        {

            sum=sum+*a++;

        }

        if(sum==m)

        {

            a=ini;

            for(int k=0;k<r;k++)

            {

                if(k!=(r-1))

                {

                    printf("%d ",*a++);

                }

                else

                {

                    printf("%d\n",*a++);

                }

            }

        }

    return;

    }

    else

    {

        for(int i=0;i<=(m-n);i++)

        {

            a=ini;

            a[q]=i+1;

            next=q+1;

            allocate(next,r);

        }

    }

    return;

}

因为用了malloc,所以头文件中需要加入malloc.h,程序在VS2010下运行。

结果截图:

三人两组

五人三组

七人三组


这个是楼主要的答案吗?

meilaoker
2012-08-28
知道答主
回答量:5
采纳率:0%
帮助的人:6359
展开全部
我懂了出题人的意思:是M个人分成N个组。每组至少一个人,也可以多人,问有多少种不同的分组。用C语言编程。M和N可以用输入,屏幕输出显示每一种分组的状况。我现在还没有想出来。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
油菜花零
2012-08-27 · TA获得超过881个赞
知道小有建树答主
回答量:501
采纳率:50%
帮助的人:335万
展开全部
你觉得你把问题讲清楚了吗?我是没明白这个要求是什么意思
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式