- 论坛徽章:
- 0
|
我贴一个,当数目比较小的时候运行还比较快.
在VC中开发.
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include "Windows.h"
void quicksort(int *p, int from ,int to)
{
int i,j,pivot,temp;
if(from >= to)
{
return;
}
i = from + 1;
j = to;
pivot = *(p + from);
while(i <= j)
{
while (*(p + i) <= pivot)
{
i++;
}
while(*(p + j) > pivot)
{
j--;
}
if(i < j)
{
temp = *(p+i);
*(p+i) = *(p+j);
*(p+j) = temp;
}
}
temp = *(p+j);
*(p+j) = pivot;
*(p+from)=temp;
quicksort(p,from,j-1);
quicksort(p,j+1,to);
}
//高位右移时,低位向左移动
void move_left_zero(int *p, int num)
{
int i,j,n;
if(num == 0)
{
return;
}
for(i = 0; i < num-1; i++)
{
if((*(p+i) == 0) &&(*(p+i+1) == 1))
{
break;
}
}
if( i == num-1)
{
}
else
{
for(j = 0; j < num-1-i; j++)
{
*(p+j) = *(p+j+i+1);
}
for(n = 0; n < i+1; n++)
{
*(p+j+n) = 0;
}
}
return ;
}
int combine_incre(int *p, int num)
{
int i;
for(i = 0; i < num-1; i++)
{
if((*(p+i) == 1) && (*(p+i+1) == 0))
{
*(p+i) = 0;
*(p+i+1) = 1;
move_left_zero(p,i);
break;
}
}
if(i == num-1)
{
return false;
}
else
{
return true;
}
}
void prepare_combine(int **p, int size, int num)
{
int i;
*p = (int*)malloc(size*sizeof(int));
memset(*p,0,size*sizeof(int));
for(i = 0; i < num ;i++)
{
*(*p + i) = 1;
}
}
//size = 12;
//测试组合数运行,组合
int combine_test(int size,int num)
{
int i;
int count = 0;
int *p;
prepare_combine(&p,size,num);
count++;
for(i = 0; i < size; i++)
{
printf("%d,",p);
}
printf("\r\n");
while(combine_incre(p,size))
{
count++;
for(i = 0; i < size; i++)
{
printf("%d,",p);
}
printf("\r\n");
}
return 0;
}
int main(int argc, char* argv[])
{
int i,size;
int a[1000];
long midsum;
long minsum;
long temp;
int count = 0;
int *p;
int *result;
size = 30;
for(i = 0; i < size; i++)
{
a = rand();
Sleep(100);
}
temp = minsum = midsum = 0;
quicksort(a,0,size-1);
for(i = 0; i < size-1; i++)
{
printf("%d,",a);
}
printf("\r\n");
//combine_test(size,size/2);
prepare_combine(&p,size,size/2);
prepare_combine(&result,size,size/2);
count++;
for(i = 0; i < size; i++)
{
if(*(p+i) == 1)
{
minsum += a;
}
midsum += a;
}
midsum /= 2;
printf("the min sum is:%d; mid sum is:%d\r\n",minsum,midsum);
while(combine_incre(p,size))
{
temp = 0;
for(i = 0; i < size; i++)
{
if(*(p+i) == 1)
{
temp += a;
}
}
if(temp == midsum)
{
for(i = 0; i < size; i++)
{
result = p;
}
break;
}
else if(temp < midsum)
{
if(temp > minsum)
{
minsum = temp;
for(i = 0; i < size; i++)
{
result = p;
}
}
}
}
printf("the sum is:%d:",minsum);
for(i = 0; i < size; i++)
{
printf("%d,",result);
}
printf("\r\n");
getchar();
return 0;
} |
|