一道ACM组合水题给出一个正整数N,从集合{1,2,3..N},中找出所有大小为k的子集,并且按照字典序由小到大输出,n

一道ACM组合水题
给出一个正整数N,从集合{1,2,3..N},中找出所有大小为k的子集,并且按照字典序由小到大输出,n,k
jftgju 1年前 已收到1个回答 举报

哎呀哎呀呀 幼苗

共回答了22个问题采纳率:95.5% 举报

代码就不贴了,给你思路吧这个题其实就是求集合数的具体集合.如果不是输出具体集合,而是输出具体有多少个集合,那么这题很简单.以N=5,K=3为例.C(5,3),5个里面选3个不重复,计算结果是(5*4*3)/(1*2*3)=10,有10个.那么具...

1年前 追问

5

jftgju 举报

首先非常感谢您的详细解答,大部分我看懂了,可还是有点云里雾里,您能不能把代码写下,我比较笨,一搬看别人题解的时候,我都要结合代码理解,一点一点拿数据模拟代码执行过程,能帮忙写下吗?具体代码不知道咋写QAQ

举报 哎呀哎呀呀

这里注意,如果题目没有限定K的大小,即一个集合可能会有无限个数,所以用来记录集合的数组S就需要是动态的,需要在main()中初始化

//全局变量
int N;
int K;
int S[20];

void Fun(int N1,int K1){
int A=K-K1,B=N-N1,C=B+1,D=N,E=K1;//其实C、E只有在K1==1的时候有用,D一直都是等于N,所以也是没有用的,
S[A] = B;
if(K1==1){//当K1==1的时候,直接就可以输出了,不用递归
for(int i=C;i<=N;i++){
S[K] = i;
print();
}
}
else{//当K1>=2的时候才需要递归
for(int i=1;N1-i>=K1-1;i++){
Fun(N1-i,K1-1);
}
}
}

void print(){//打印集合,输出数组S[1]到S[K]的具体数
for(int i=1;i<=K;i++){
cout<}
cout<<"n";
}

int main(){
输入N和K;
C(N,K);
}


C++很久没用,具体语法不知道对不对

可能相似的问题
Copyright © 2024 YULUCN.COM - 雨露学习互助 - 17 q. 0.013 s. - webmaster@yulucn.com