编程组合问题
代码如下:
#include <stdio.h>
//要求六个数字相加的和
#define AIM 39
int main(){
int number[10]; //用来存放1到10
int su[6];
int i,sum,j=0,k,flag=1;
for(i=0;i<10;i++)
number[i]=i+1;
for(i=0;i<6;i++)
su[i]=0;
for(su[0]=0;su[0]<10;su[0]++)
for(su[1]=0;su[1]<10;su[1]++)
for(su[2]=0;su[2]<10;su[2]++)
for(su[3]=0;su[3]<10;su[3]++)
for(su[4]=0;su[4]<10;su[4]++)
for(su[5]=0;su[5]<10;su[5]++)
{
//j++;
//printf("%d ",j);
sum=0;
for(i=0;i<6;i++)
sum+=number[su[i]];
//printf("%d ",sum);
//如果相加的和满足要求则输出组合
if(sum==AIM){
//判断六个数字之中是否有重复的,并且排除排列顺序不同的组合
for(k=0;k<6;k++)
for(i=k+1;i<6;i++)
if(number[su[i]]<=number[su[k]])
flag=0;
if(flag==1){
for(i=0;i<6;i++)
printf("%d ",number[su[i]]);
j++;
printf(" ");
}
flag=1;
}
}
printf("总共有%d个满足要求的组合 ",j);
return 0;
}
其中宏定义#define AIM后面的数字为需要的总和
本代码选出的组合中数字不能重复
和为39的组合运行结果如下:

⑵ java最优组合编程问题
没人回答是因为这个没有现成代码,大伙儿也不愿意为了一个问题真的去写
我说一下思路把
1、创建一个map,存储每个点可以合作的点集,如
HashMap<String,List<String>> hp = new ...
hp.add("A", new ArrayList<String>[]{"B", "E", "F", "G"});
b
c..都这么建一遍
2、建一个Stack,按照规则1,把每种排列都枚举出来
3、把所有结果按照个数排序
⑶ c语言编程的排列组合问题
程序有一些乱,实在不知道你要做什么。
你要说排列组合吧,还有好多重复的,怎么没完没了了呢?

请说得更仔细一些好吗?
⑷ c语言编程排列组合
void Show(int n,int len ,char str[], char p[],int *i){/*函数功能说明:
密码穷举法 递归算法参数说明:len 密码可选元素的个数,实际等于 strlen(str);
n 密码位数。
STR[]密码表。
*p 密码排列组合的临时存档*/int a;n--;for(a=0; a < len; a++){p[n]=str[a];
if(n==0)printf("%d:%s ",(*i)++,p);
if(n0)Show(n,len , str,p,i);}}
/*驱动程序 用于测试*/
int main(void){char str[]="abcdef";//密码表 可选元素集合可根据选择修改
int n=4;//密码位数,根据具体应用而定。
int len=strlen(str);//用于密码元素集合计数。
char p[20];//存放排列组合的密码,用于输出。
int num=0;//存放统计个数的整数值,
int *i=#//计数器 地址。
p[n]='\0';//这个不用说啦。
printf("\n%d 位密码,每个密码有%d个选择的话,共有:%d个组合。\n",n,len,*i);return 0;}
以上回答你满意么?
⑸ C语言编程求解一个排列组合问题。急!
#include<stdio.h>
#include<stdlib.h>
#include <string.h>
void process(int *,int,int);
char *s;
int size;
void main(void)
{
int n, m;
printf("Please enter n and m:");
scanf("%d%d",&n,&m);
while(n<m|| n>9)
{
if(n>9) printf("N must less than 10\n");
else printf("N must greate or equal M\n");
printf("Please enter n and m:");
scanf("%d%d",&n,&m);
}
int *p=new int[n];
s=new char[n+1];
s[0]='\0';
for(int i=0;i<n;i++)
{
p[i]=i+1;
}
process(p,m,n);
system("pause");
}
void process(int * p,int m,int n)
{
if(m==0)
{
printf("\n");
return;
}
for(int i=0;i<n;i++)
{
if(p[i]!=0){
printf("%d",p[i]);
size=strlen(s);
s[size++]=p[i]+'0';
s[size]='\0';
p[i]=0;
process(p,m-1,n);
p[i]=i+1;
size=strlen(s);
if(size>0)s[--size]='\0';
if(size>0)
{
bool isprint=false;
for (int j=i+1;j<n;j++)
{
if(p[j]!=0){
{
isprint=true;
break;
}
}
}
if(isprint)printf("%s",s);
}
}
}
}
不要意思没加注释,要睡觉了。有什么不明白的再追问吧。我要sleep了。呵呵。
不好意思没看到最后一句等效的。看来我把问题做复杂了。呵呵。
下面的代码是在上面的基础上改的。有些乱了,不过运行还是没问题的。
#include<stdio.h>
#include<stdlib.h>
#include <string.h>
void process(int *,int,int,int);
char *s;
int size;
void main(void)
{
int n, m;
printf("Please enter n and m:");
scanf("%d%d",&n,&m);
while(n<m|| n>9)
{
if(n>9) printf("N must less than 10\n");
else printf("N must greate or equal M\n");
printf("Please enter n and m:");
scanf("%d%d",&n,&m);
}
int *p=new int[n];
s=new char[n+1];
s[0]='\0';
for(int i=0;i<n;i++)
{
p[i]=i+1;
}
process(p,m,n,0);
system("pause");
}
void process(int * p,int m,int n,int start)
{
if(m==0)
{
printf("\n");
return;
}
for(int i=start;i<n-m+1;i++)
{
if(p[i]!=0){
printf("%d",p[i]);
size=strlen(s);
s[size++]=p[i]+'0';
s[size]='\0';
p[i]=0;
process(p,m-1,n,i+1);
p[i]=i+1;
size=strlen(s);
if(size>0)s[--size]='\0';
if(size>0)
{
int count=0;
bool isprint=false;
for (int j=i+1;j<n;j++)
{
if(p[j]!=0){
{
isprint=true;
count++;
}
}
}
if(count==0||count<m)isprint=false;
if(isprint)printf("%s",s);
else return;
}
}
}
}
⑹ 编程中排列组合的问题(4个数字中(数字范围0-9),每3个为一组,允许数字重复使用,求所有组合)
从4个数字中取3个数,且能重复选用。所以每取一位都有4种选择,共有4³=64个数
