排列组合NP难题,C++求解,求具体代码
答案:2 悬赏:0
解决时间 2021-01-29 06:10
- 提问者网友:你挡着我发光了
- 2021-01-29 03:14
排列组合NP难题,C++求解,求具体代码
最佳答案
- 二级知识专家网友:山有枢
- 2021-01-29 04:21
列出 N个数中取M个的全部组合
void combine(int a[], int n, int m, int b[], int M);
参数:
a 存放候选数字
n 总项数
m 取出项数
b 存放选出结果
M= m
#include "stdio.h"
#define MAX 100
void combine(int a[], int n, int m, int b[], int M);
int main(void)
{
int i;
int a[MAX], b[MAX];
for (i = 1; i < 100; i++)
a[i - 1] = i;
combine(a, 5, 4, b, 4);
}
void combine(int a[], int n, int m, int b[], int M)
{
int i, j;
for (i = n; i >= m; i--)
{
b[m - 1] = i - 1;
if (m > 1)
combine(a, i - 1, m - 1, b, M);
else
{
for (j = M - 1; j >= 0; j--)
printf("%d ", a[b[j]]);
printf("\n");
}
}
}
追问:哥们,别逗我行不......
void combine(int a[], int n, int m, int b[], int M);
参数:
a 存放候选数字
n 总项数
m 取出项数
b 存放选出结果
M= m
#include "stdio.h"
#define MAX 100
void combine(int a[], int n, int m, int b[], int M);
int main(void)
{
int i;
int a[MAX], b[MAX];
for (i = 1; i < 100; i++)
a[i - 1] = i;
combine(a, 5, 4, b, 4);
}
void combine(int a[], int n, int m, int b[], int M)
{
int i, j;
for (i = n; i >= m; i--)
{
b[m - 1] = i - 1;
if (m > 1)
combine(a, i - 1, m - 1, b, M);
else
{
for (j = M - 1; j >= 0; j--)
printf("%d ", a[b[j]]);
printf("\n");
}
}
}
追问:哥们,别逗我行不......
全部回答
- 1楼网友:英雄的欲望
- 2021-01-29 05:08
是模拟手动清点吗?难道不是可以直接算出来的吗?
比如说,这么算:
根据题意,需要在集合A={(a,b,c,d)|a<b<c<d<=M},其个数是p=Cm4。在这p个数里选出条件1和2的组合。即,集合B={((a,b,c,d),(e,f,g,h)|a<b<c<d<=M,e<f<g<h<=M},个数为x里选出符合条件1和2的个数。
分析,条件1,可设组合形式为(a(b,c,d))-(a,(f,g,h)(内部无序),(a,b,c,d)-(e,f,g,h)(内部有序)。两个部分。直接相加就是结果。
条件2,类似。
总之,算出来就好了啊。如果是清点,确实……太占空间。
比如说,这么算:
根据题意,需要在集合A={(a,b,c,d)|a<b<c<d<=M},其个数是p=Cm4。在这p个数里选出条件1和2的组合。即,集合B={((a,b,c,d),(e,f,g,h)|a<b<c<d<=M,e<f<g<h<=M},个数为x里选出符合条件1和2的个数。
分析,条件1,可设组合形式为(a(b,c,d))-(a,(f,g,h)(内部无序),(a,b,c,d)-(e,f,g,h)(内部有序)。两个部分。直接相加就是结果。
条件2,类似。
总之,算出来就好了啊。如果是清点,确实……太占空间。
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯