演算法之道_流水線裝配問題_動態規劃
#include<stdio.h>
int Record[2][10];
int countA=0;
int countB=0;
typedef struct data
{
int da;
int min;
int Tonext;
}Data;
int min(int x ,int y,int i)
{
if(x>y)
{
if(i==1) { Record[0][countA] = 2; countA++;}
else
{ Record[1][countB]=1; countB++;
}
return y;
}
else
{ if (i==1)
{
Record[0][countA]=1; countA++;
}else
{ Record[1][countB] =2; countB++;
}
return x;
}
}
void findMin(Data A[10],Data B[10])
{
int i = 0;
int j = 0;
for( i = 1; i < 7; i++ )
{
A[i].min = min(A[i-1].min+A[i].da,B[i-1].min+B[i-1].Tonext+A[i].da,1);
printf("%d ",A[i].min);
B[i].min = min(B[i-1].min+B[i].da,A[i-1].Tonext+A[i-1].min+B[i].da,2);
printf("%d\n",B[i].min);
}
printf("%d\n",min(A[6].min,B[6].min,1));
}
void main()
{
Data A[10],B[10];
int i = 0;
A[0].min = 1;
B[0].min = 2;
for( i = 0; i < 7; i++)
{
scanf("%d",&A[i].da);
scanf("%d",&B[i].da);
}
A[0].min+=A[0].da;
B[0].min+=B[0].da;
for( i = 0; i < 6; i++ )
{
scanf("%d",&A[i].Tonext);
scanf("%d",&B[i].Tonext);
}
findMin(A,B);
printf("%d ",Record[0][5]);
int j = 1;
for(int w = 4; w >= 0; w-- )
{
printf("%d ",Record[j-1][w]); //由後向前列印
j = Record[j-1][w];
}
}