![](https://iknow-base.cdn.bcebos.com/lxb/notice.png)
C语言类问题.用递归法求从n个人中选择k个人组成一个委员会的不同组合数.
3个回答
展开全部
#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");
}
展开全部
//递归的话需要用到组合的递推公式: 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];
}
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;
}
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
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);
}
}
{
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);
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询