主题:我写的装箱子算法( 有谁还能再减少大箱子的数目)
//////////////////////////////////////////////////////////////////////////////////////////////////
// filename : loadbox.c
// distription : 想固定的空间装箱子
// date : 7.27.2006
// edition : 1.0
//////////////////////////////////////////////////////////////////////////////////////////////////
#include <stdio.h>
#include <malloc.h>
#define max 100
#define wide 10
struct box //被装入箱子的结构
{
char name; //箱子的名字
int lenth; //箱子的长度
};
void sort( struct box *p[], int n );
void swap( struct box *p1, struct box *p2 );
void delete( struct box *p[], int l, int n );
//////////////////////////////////////////////////////////////////////////////////////////////////
// function : creatbox
// distription : 建立好箱子的数目于大小,并进行装入
// argument : 无
// return : 无
//////////////////////////////////////////////////////////////////////////////////////////////////
void creatbox( )
{
int big[max];
struct box *small[max];
char c;
int n;
int i, j;
printf( "input the small amount : "); //输入要装箱子的数量
fflush( stdout );
scanf("%d", &n);
for( i = 0; i < n; i++ ) //将大箱子的空间清空
{
big[i] = 0;
}
for( i = 0; i < n; i++ )
{
small[i] = ( struct box * )malloc( sizeof( struct box ) );
if( small[i] == NULL )
{
printf( "out of space ! \n" );
fflush( stdout );
return;
}
}
printf( "input the name and the lenth and the lenth must less than 10 \n" );
fflush( stdout );
for( i = 0; i < n; i++ ) //分配小箱子的形状
{
printf( "name,lenth : \n " );
fflush( stdout );
while( ( c = getchar() ) != '\n' )
{
;
}
scanf("%c,%d", &small[i]->name, &small[i]->lenth );
if( small[i]->lenth > wide )
{
printf( "must less than 10 " );
fflush( stdout );
return;
}
}
sort( small , n ); //将箱子的长度进行排序
for( i = 0; i < n; i++ )
{
printf(" name : %c , lenth : %d \n", small[i]->name, small[i]->lenth );
}
for( i = 0; i < n; i++ ) //如果其他的箱子刚好于大箱子剩下的空间相符合,则装入
{
for( j = n - 1; j > 0; j-- )
{
if( big[i] + small[j]->lenth == wide )
{
big[i] = big[i] + small[j]->lenth;
printf("the %c -------> big %d ,lenth: %d ", small[j]->name, i, small[j]->lenth );
delete( small, j, n );
n = n - 1;
break;
}
else if( big[i] + small[j]->lenth < wide ) //其他的不超国大箱子的空间,则可以进入
{
big[i] = big[i] + small[j]->lenth;
printf("the %c -------> big%d , lenth: %d ", small[j]->name, i, small[j]->lenth );
delete( small, j, n );
printf( "in " );
fflush( stdout );
n = n - 1;
}
}
}
}
// filename : loadbox.c
// distription : 想固定的空间装箱子
// date : 7.27.2006
// edition : 1.0
//////////////////////////////////////////////////////////////////////////////////////////////////
#include <stdio.h>
#include <malloc.h>
#define max 100
#define wide 10
struct box //被装入箱子的结构
{
char name; //箱子的名字
int lenth; //箱子的长度
};
void sort( struct box *p[], int n );
void swap( struct box *p1, struct box *p2 );
void delete( struct box *p[], int l, int n );
//////////////////////////////////////////////////////////////////////////////////////////////////
// function : creatbox
// distription : 建立好箱子的数目于大小,并进行装入
// argument : 无
// return : 无
//////////////////////////////////////////////////////////////////////////////////////////////////
void creatbox( )
{
int big[max];
struct box *small[max];
char c;
int n;
int i, j;
printf( "input the small amount : "); //输入要装箱子的数量
fflush( stdout );
scanf("%d", &n);
for( i = 0; i < n; i++ ) //将大箱子的空间清空
{
big[i] = 0;
}
for( i = 0; i < n; i++ )
{
small[i] = ( struct box * )malloc( sizeof( struct box ) );
if( small[i] == NULL )
{
printf( "out of space ! \n" );
fflush( stdout );
return;
}
}
printf( "input the name and the lenth and the lenth must less than 10 \n" );
fflush( stdout );
for( i = 0; i < n; i++ ) //分配小箱子的形状
{
printf( "name,lenth : \n " );
fflush( stdout );
while( ( c = getchar() ) != '\n' )
{
;
}
scanf("%c,%d", &small[i]->name, &small[i]->lenth );
if( small[i]->lenth > wide )
{
printf( "must less than 10 " );
fflush( stdout );
return;
}
}
sort( small , n ); //将箱子的长度进行排序
for( i = 0; i < n; i++ )
{
printf(" name : %c , lenth : %d \n", small[i]->name, small[i]->lenth );
}
for( i = 0; i < n; i++ ) //如果其他的箱子刚好于大箱子剩下的空间相符合,则装入
{
for( j = n - 1; j > 0; j-- )
{
if( big[i] + small[j]->lenth == wide )
{
big[i] = big[i] + small[j]->lenth;
printf("the %c -------> big %d ,lenth: %d ", small[j]->name, i, small[j]->lenth );
delete( small, j, n );
n = n - 1;
break;
}
else if( big[i] + small[j]->lenth < wide ) //其他的不超国大箱子的空间,则可以进入
{
big[i] = big[i] + small[j]->lenth;
printf("the %c -------> big%d , lenth: %d ", small[j]->name, i, small[j]->lenth );
delete( small, j, n );
printf( "in " );
fflush( stdout );
n = n - 1;
}
}
}
}