분기 한계 법 으로 적재 문 제 를 해결 하 는 FIFO 대기 열 방식 의 총화

1. 데이터 구 조 를 만 들 기 위해 순서 대기 열 을 말 합 니 다.
 
/************************************************************************
    (    )  FIFO     --             ,
                。          ,  main() 
      ,  EnQueue(), Add(), DeQueue()     E bestE  
          QUEUE *     int  。           
  ,    。          ,            ,  
    *parent, weigth, LChild, *next。            ,  
                         ,E bestE    ,
       LQ            ,             ,
           ,            *parent, weigth, LChild
   ,            。            ,     
 ,      ,         ,              (  
    )。                     ,        
 parent, weight,LChild   ,          SQ。        
                       ,           
 。so,weight, parent, LChild        weight[], parent[], LChild[];
       E->weight    E         weight,     
     weight[E]    ,     ,E QUEUE*  ,      
       ,         ,     int ,       , 
1  (0       weight  -1 )。   ,         
bestx[j] = bestE->LChild ;bestE = bestE ->parent ;      :
bestx[j] = Q->LChild[bestE] ;	bestE = Q->parent[bestE] ;so,      
          。
               ,            ,       
     。                   ,         ,
                   ,          ,     
             Q[100];   
struct
{
	int weight;
	int LChild;
	int parent;
}Q[MAXSIZE];
int front, int rear;
            weight, LChild, parent         。 front, 
rear       ,      。               。
*******************************************************************************/
#include
#include

#define	MAXSIZE	100
typedef struct 
{
	int weight[MAXSIZE];
	int LChild[MAXSIZE];
	int parent[MAXSIZE];
	int front, rear;
}SEQUEUE;

//       :*bestx,bestw。
int *bestx ;
int bestw = 0 ; //       

void InitQueue(SEQUEUE *SQ)
{
	SQ->front=SQ->rear=0;
	for(int i=0;iparent[i]=-1;
	}
}

int Empty(SEQUEUE *SQ)
{
	if(SQ->rear==SQ->front)
		return 1;
	else
		return 0;
}

int Add(SEQUEUE *SQ, int w, int E, int l)
{
	if((SQ->rear+1)%MAXSIZE==SQ->front)
	{
		printf("    !
"); return 0; } SQ->rear=(SQ->rear+1)%MAXSIZE; SQ->weight[SQ->rear]=w; SQ->LChild[SQ->rear]=l; SQ->parent[SQ->rear]=E; return 1; } int DeQueue(SEQUEUE *SQ, int *E) { if(Empty(SQ)) { printf(" !
"); return 0; } SQ->front=(SQ->front+1)%MAXSIZE; *E=SQ->front; return 1; } void EnQueue(SEQUEUE *SQ, int wt, int i, int n , int E , int *bestE , int ch) { if(i==n) { if(wt==bestw) { *bestE = E;//bestE i==n , , bestE, , bestE=bestE->parent; , bestx[n] = ch; } return; } Add(SQ, wt , E, ch); // } /* int GetHeadQueue(SEQUEUE *SQ, int *x) { if(Empty(SQ)) { printf(" !
"); return 0; } *x=SQ->data[(SQ->front+1)%MAXSIZE]; return 1; } */ int MaxLoading(int w[], int c, int n)// { int err ; // int i = 1; // int cnt=0; int Ew = 0; // int r = 0 ; // int flag=0; int E=0; int bestE=0; SEQUEUE *Q=(SEQUEUE *)malloc(sizeof(SEQUEUE)); // for(int j =2; j<=n; j++) { r += w[j]; } bestw = 0; // InitQueue(Q); err=Add(Q, -1, 0, 0); if(!err) { return 0 ; } while (true) { int wt = Ew + w[i] ; if (wt <= c) // { if(wt>bestw) bestw = wt ;// x[i] = 1 EnQueue(Q, Ew + w[i], i , n , E , &bestE , 1); flag=1; /****** , if(!flag), else *** if(Ew+r>=bestw&&ibestw&&i bestw //(bestw ), , ( ) // bestw , , ( if , )。 } DeQueue(Q, &E); if (E!=0&&Q->weight[E] == -1) // E!=NULL , if(E->weight==-1) {// if (Empty(Q)) { break; } if(iweight[E]; } for(int j = n-1; j>0; j--)// { bestx[j] = Q->LChild[bestE] ; bestE = Q->parent[bestE] ; } return 0 ; } int main() { int n =0 ; int c = 0 ; int i = 0 ; int* w ; FILE *in , *out ; in = fopen("input4.txt" , "r") ; if(in==NULL) { printf("
") ; return 1 ; } fscanf(in , "%d" , &n) ; fscanf(in , "%d" , &c) ; w = (int*)malloc(sizeof(int)*(n+1)) ; bestx = (int*)malloc(sizeof(int)*(n+1)) ; for(i =1 ; i<=n ; i++) { fscanf(in , "%d" , &w[i]) ; } MaxLoading(w , c , n) ; out = fopen("output.txt" , "w") ; for(i=1 ; i<=n ; i++) { fprintf(out , "%d\t" , bestx[i]) ; } fprintf(out , "
") ; fclose(in); fclose(out); return 0 ; }

2. 체인 대기 열 을 다시 말 해서 데이터 구 조 를 구축한다.
/************************************************************
        FIFO      v0.3  ,    
    +    +           +       
  : input.txt   n,c,w[1], w[2], ......, w[n]。
  :   output.txt bestx[1], bestx[2], ......, bestx[n]  
		   w[i]   ,        。
    :  。                     ,
			              ,  *parent, LChild 
*************************************************************/
#include
#include

typedef struct Qnode{
    struct Qnode *parent; //         
	struct Qnode* next ;
    int LChild;        //      
    int weight;       //          
}QTYPE;
/*  :   *E, *bestE      QTYPE  ,  E bestE  QTYPE  ,     LinkQUEUE  。E bestE       , LinkQUEUE *Q Q     ,    Q,    ,  front  rear  LinkQUEUE     ,   QTYPE   ,     Q。Q->front, Q->rear.
*/
typedef struct	
{					//
	QTYPE	*front,	*rear;
}LinkQUEUE;					// 

//  2     :*bestx,bestw。
int *bestx ;
int bestw = 0 ; //       

int InitQueue(LinkQUEUE *LQ)//     
{
	QTYPE	*p;
	p=(QTYPE *)malloc(sizeof(QTYPE));
	if(!p)
	{
		printf("       !
"); return 0; } p->next=NULL; p->weight=-1; p->parent=NULL; LQ->front=LQ->rear=p; return 1; } int Add(LinkQUEUE *LQ, int w, QTYPE *E, int l)// { QTYPE *q; q=(QTYPE *)malloc(sizeof(QTYPE)); if(!q) { printf(" !
"); return 0; } q->weight=w;// q->next=NULL; q->parent=E;// q->LChild=l;// LQ->rear->next=q; LQ->rear=q; return 1; } int IsEmpty(LinkQUEUE *LQ)// { return (LQ->front==LQ->rear?1:0); } /* , *E, */ int Delete(LinkQUEUE *LQ, QTYPE **E) { QTYPE *tmp=NULL; if(IsEmpty(LQ)) { printf(" !
"); return 0; } tmp=LQ->front->next; LQ->front->next=tmp->next; if(LQ->front->next==NULL) LQ->rear=LQ->front; *E=tmp; //free(tmp); return 1; } /* */ void EnQueue(LinkQUEUE *LQ, int wt,int i, int n , QTYPE *E ,QTYPE **bestE , int ch) { if(i==n) { if(wt==bestw) { *bestE = E;//bestE i==n , , bestE, // , bestE=bestE->parent; // , bestx[n] = ch; } return; } Add(LQ, wt , E, ch); // } int MaxLoading(int w[], int c, int n)// { int err ; // int i = 1; // int cnt=0; int Ew = 0; // int r = 0 ; // int flag=0; LinkQUEUE *Q=(LinkQUEUE *)malloc(sizeof(LinkQUEUE)); // QTYPE *E=NULL; QTYPE *bestE=NULL; for(int j =2; j<=n; j++) { r += w[j]; } bestw = 0; // InitQueue(Q); err=Add(Q, -1, NULL, 0); if(!err) { return 0 ; } while (true) { int wt = Ew + w[i] ; if (wt <= c) // { if(wt>bestw) bestw = wt ;// x[i] = 1 EnQueue(Q, Ew + w[i], i , n , E , &bestE , 1); flag=1; /*** , if(!flag), else if(Ew+r>=bestw&&ibestw&&i //bestw(bestw ), // , ( ) // bestw , , // ( if , )。 } Delete(Q, &E); if (E!=NULL&&E->weight == -1) // E!=NULL , //if(E->weight==-1) {// if (IsEmpty(Q)) { break; } if(iweight ; } for(int j = n-1; j>0; j--)// { bestx[j] = bestE->LChild ; bestE = bestE ->parent ; } return 0 ; } int main() { int n =0 ; int c = 0 ; int i = 0 ; int* w ; FILE *in , *out ; in = fopen("input.txt" , "r") ; if(in==NULL) { printf("
") ; return 1 ; } fscanf(in , "%d" , &n) ; fscanf(in , "%d" , &c) ; w = (int*)malloc(sizeof(int)*(n+1)) ; bestx = (int*)malloc(sizeof(int)*(n+1)) ; for(i =1 ; i<=n ; i++) { fscanf(in , "%d" , &w[i]) ; } MaxLoading(w , c , n) ; out = fopen("output.txt" , "w") ; for(i=1 ; i<=n ; i++) { fprintf(out , "%d\t" , bestx[i]) ; } fprintf(out , "
") ; fclose(in); fclose(out); return 0 ; }

셋.
실행 결과:
input. txt 에 n = 4, c = 70, w1 = 30, w2 = 25, w3 = 15, w4 = 10 을 입력 하 십시오.
output. txt 에서 실행 결 과 를 보기:
이 1, 11, 10 은 bestx [i] 의 결과 입 니 다. bestx [i] = 1 은 이 가 지 를 선택 한 것 을 의미 합 니 다. 즉, i 번 째 화물 선적 으로 0 은 선적 하지 않 는 다 는 것 을 의미 합 니 다.

좋은 웹페이지 즐겨찾기