C语言类问题.用递归法求从n个人中选择k个人组成一个委员会的不同组合数.

注意:k应该小于等于n,如果k值不合理,应该输出Error... 注意:k应该小于等于n,如果k值不合理,应该输出Error 展开
 我来答
beibeiniu315
2014-12-05
知道答主
回答量:7
采纳率:0%
帮助的人:2.9万
展开全部
#include <stdio.h>
#include <stdlib.h>
int Comb(int n, int k)
{
    if (n==k || k==0)
        return 1; //边界值
    else
        return Comb(n-1, k)+Comb(n-1, k-1);    
}
void main()
{
    int n, k;
    printf("请输入总人数 n: ");
    scanf("%d", &n);
    printf("请输入委员会人数 k: ");
    scanf("%d", &k);
    if (k<0 || n<0 || k>n) //输入数据的合法性判断
        printf("输入不合法!");
    else
        printf("组合数有 %d 个!",Comb(n, k));
    system("pause");
}
寒寒家
2014-12-05 · TA获得超过2920个赞
知道大有可为答主
回答量:1482
采纳率:100%
帮助的人:1981万
展开全部
//递归的话需要用到组合的递推公式: C(n, k) = C(n - 1, k - 1) + C(n - 1, k)

int tar_func(int ** res, int n, int k){
if( k > n) return -1;

if(k == n) return 1;
int res1 = 0, res2 = 0;

if(res[n - 1] [ k-1] == 0){
res1 = tar_func(res, n-1, k-1);

if(res1 == -1) return -1;

else{

res[n-1] [k-1] = res1;

}

}else{

res1 = res[n-1][k-1];

}

if(res[n-1][k] == 0){

res2 = tar_func(res, n-1, k);

if(res2 == -1) return -1;

else res[n-1][k] = res2;

}else{

res2 = res[n-1][k];

}

res[n][k] = res1 + res2;

return res[n][k];

}
追问
饿,答案显示错误。Total score:0Judge Result:Compilation ErrorError:5_0_2482342_12695.c D:\Temp\5_0_2482342_12695.c(2) : error C2143: 语法错误 :
追答

//修改了下,这种方法用数组保存了以前计算过的状态,避免的重复计算。

#include <iostream>
#include <cmath>
using namespace std;
int tar_func(int res[][10], int n, int k){
if( k > n) return -1;
if(k == n ) return 1;
if(k == 1) return n;
if(k == 0) return 0;
int res1 = 0, res2 = 0;
if(res[n - 1] [ k-1] == 0){
res1 = tar_func(res, n-1, k-1);
if(res1 == -1) return -1;
else{
res[n-1] [k-1] = res1;
}
}else{
res1 = res[n-1][k-1];
}
if(res[n-1][k] == 0){
res2 = tar_func(res, n-1, k);
if(res2 == -1) return -1;
else res[n-1][k] = res2;
}else{

res2 = res[n-1][k];
}
res[n][k] = res1 + res2;
return res[n][k];
}
int main(){
int res[10][10];
for(int i = 0 ; i < 10; i ++){
for(int j = 0 ;j < 10; j ++){
res[i][j] = 0;
}
}
int res2 = 0;
res2 = tar_func(res, 4, 2);
return 0;
}
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
bluebellEmily
2014-12-05 · TA获得超过117个赞
知道小有建树答主
回答量:83
采纳率:0%
帮助的人:81.5万
展开全部
int func(int n, int k)
{
if ( k == 1)
return n;
else
return n*func(n-1, k -1);
}

int getGroup(int n, int k)
{
if (k > n){
return -1;
} else {
return func(n,k)/func(k, k);
}
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式