这就是16选7的排列组合问题~16选7有点大,但我可以给一个思路你~
1:设计7个元素a0a1a2a3a4a5a6分别对应原数组0123456的位置,
2:6往后移动到到b15;
3:a5进一,a6回到a5的前一位
4:a6再次移动到b15,a5进一;
5:------直到a5移动到b14(此时a6在b15)
6:a4进一,a5在a4的前面,a5在a6的前面
7----(慢慢理解)重复上述过程,直到a5a6分别在b14,b15,此时a4进1
8----(重复上述过程)直到-------
9----直到a0在b9的位置---
10----当然,如果中途有满足a0+a1+a2+a3+a4+a5+a6=100的,则分别输出此时a0a1a2a3a4a5a6的值
以下有一个关于排列组合的代码,但只考虑排列方面(就是说连a里面的元素排位也考虑进去了,步骤比单纯组合多很多)
为了简便(那个代码虽然也能算,但是加上位置排列步骤太多了~为了简便,便来了个10选5=60的,希望对你有所帮助)
(其实排列算法比组合还要复杂一些,但排列通用性强于组合)
程序代码:
#include<stdio.h>
#define N 10
void begin();//初始化处理
void change(int []);//操作函数
void number(int [],int);//排序函数
void swap(int *,int *);//交换函数
void print(int []);//输出函数
void begin()
{
int a[N]={1,2,4,5,8,12,13,16,18,28};
printf("\n");
number(a,0);//对输入数进行排序
change(a);//执行操作
}
void change(int a[])
{
int i,k1,k2,sum;
for (i=k1=0;i<N-1;i++)
if (a[i]<a[i+1])
k1=i+1;//a[k1]为右端数的最大值
for (i=5;i<10;i++)
sum+=a[i];
if (sum==60)
{
printf("找到满足要求的数,数据如下:\n");
for (i=5;i<10;i++)
printf("%4d",a[i]);
printf("\n");
return;
}
if (!k1)
{
printf("没能满足要求");
return;
}
for (k2=k1;k2<N-1;k2++)
if (a[k1-1]<=a[k2]&&a[k1-1]>=a[k2+1])
break;//k2为交换数据的关键值
swap(&a[k1-1],&a[k2]);//交换数值
number(a,k1);
return (change(a));
}
void swap(int *a,int *b)//交换两数值的函数
{
int t;
t=*a;
*a=*b;
*b=t;
}
void number(int a[],int k1)//排序函数
{
int i,j,u;
for (i=k1,u=0;i<N;i++,u++)
for (j=k1;j<N-1-u;j++)
if (a[j]>a[j+1])
swap(&a[j],&a[j+1]);//交换数值
}
void print(int a[])
{
int i;
for (i=0;i<N;i++)
printf("%d ",a[i]);
printf("\n");
}
int main()
{
begin();
return 0;
}