編程組合問題
代碼如下:
#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個數
