【发布时间】:2015-07-02 20:46:51
【问题描述】:
我想编写一个函数来从 n 元素列表中选择 k 元素的组合。我有给定的 pdf 格式的源文件,我转换为文本。我得到了以下列表。我试图使用 @987654321 @ 查找组合,但需要首先管理约束,这让我感到困惑。假设我们需要从以下列表中选择 3 个主题。在以下几行中,/ 表示这些科目中的任何一个,例如应该选择Ex.from a)History or Sociology or Economics。约束条件是数学不能与孟加拉语或印地语有任何组合。
一些有效的组合是
History,Bengali,Sanskrit
Bengali,Philosophy,English
列表的快照 -
a) History/Sociology/Economics
b) Bengali/Hindi
c) Sanskrit/Mathematics
d) Philosophy
e) Political Science
f) English
总共 3 个主题组合将类似于 (6C3*3*2*2)-24(根据我的计算)
我正在考虑一种表示列表的方法,以便我可以有效地对其进行编码。但无法找到解决此问题的合理方法。
这是我的实现
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int counter=0;
void combination(char *p[10],char *d[10],int start,int end,int index,int r){
int i,j,k=0;
// char ch[10]="History";
if(index==r){
if(!strcmp(d[0],"History")){
if(!strcmp(d[1],"Sociology") || !strcmp(d[1],"Economics") || !strcmp(d[2],"Sociology") || !strcmp(d[2],"Economics"))
return;
}
if(!strcmp(d[0],"Sociology")){
if(!strcmp(d[1],"History") || !strcmp(d[1],"Economics") || !strcmp(d[2],"History") || !strcmp(d[2],"Economics"))
return;
}
if(!strcmp(d[0],"Economics")){
if(!strcmp(d[1],"History") || !strcmp(d[1],"Sociology") || !strcmp(d[2],"History") || !strcmp(d[2],"Sociology"))
return;
}
if(!strcmp(d[0],"Bengali")){
if(!strcmp(d[1],"Hindi") || !strcmp(d[2],"Hindi") || !strcmp(d[1],"Mathematics") || !strcmp(d[2],"Mathematics"))
return;
}
if(!strcmp(d[0],"Hindi")){
if(!strcmp(d[1],"Bengali") || !strcmp(d[2],"Bengali") || !strcmp(d[1],"Mathematics") || !strcmp(d[2],"Mathematics"))
return;
}
if(!strcmp(d[0],"Sanskrit")){
if(!strcmp(d[1],"Mathematics") || !strcmp(d[2],"Mathematics"))
return;
}
if(!strcmp(d[0],"Mathematics")){
if(!strcmp(d[1],"Sanskrit") || !strcmp(d[2],"Sanskrit") || !strcmp(d[1],"Bengali") || !strcmp(d[2],"Bengali") || !strcmp(d[1],"Hindi") || !strcmp(d[2],"Hindi"))
return;
}
if(!strcmp(d[1],"Mathematics")){
if(!strcmp(d[2],"Bengali") || !strcmp(d[2],"Hindi"))
return;
}
if(!strcmp(d[2],"Mathematics")){
if(!strcmp(d[1],"Bengali") || !strcmp(d[1],"Hindi"))
return;
}
for(j=0;j<r;j++)
printf("%s ",d[j]);
counter++;
printf("\n");
return;
}
for(i=start;i<=end && end-i+1>=r-index; i++){
d[index]=p[i];
combination(p,d,i+1,end,index+1,r);
}
}
int main(){
char *subject[10],n[50],*p,*data[10];
int len,i,m;
printf("\nEnter the no subject\n");
scanf("%d",&m);
printf("\nEnter name of subject\n");
for(i=0;i<m;i++){
scanf("%s",n);
len=strlen(n);
p=(char *)malloc(len+1);
strcpy(p,n);
subject[i]=p;
}
combination(subject,data,0,m-1,0,3);
printf("\nCount=%d\n",counter);
return 0;
}
如果列表越来越大,那么如何处理输出它会很大,那么复杂性会增加,最终会失败 是否有任何优雅的方法可以使用任何语言的预定义语言数据结构来解决这个问题
【问题讨论】:
-
解决方案会因语言而异。请选择一个,我推荐您尝试编写的那个。您尝试过自己解决它吗?
-
1) 哪种语言? 2)到目前为止你尝试了什么?我们不在这里做作业。
-
这是来自我正在处理的一个项目,它有一个这样的列表,我必须根据列表中的所有可能组合来检查它是否是一个有效的选择选项@holgac
-
好吧,DFS 可能会工作。检查每个深度和深度 3 的约束,您将获得所需的组合。如果你写了类似的代码仍然有问题,我们可以提供更多帮助。
-
@JoachimPileborg 为什么解决方案如此依赖于语言? OP 要求的是算法,而不是代码。让他/她指定一种语言是没有意义的。
标签: java python c algorithm combinations