¡¶Ëã·¨·ÖÎöÓëÉè¼Æ¡·ÆÚÄ©¿¼ÊÔ¸´Ï°Ìâ¸Ù(ÍêÕû°æ) ÏÂÔØ±¾ÎÄ

Partitionº¯ÊýµÄ¾ßÌåʵÏÖ template

int Partition (Type a[], int p, int r) {

int i = p, j = r + 1; Type x=a[p];

// ½«< xµÄÔªËØ½»»»µ½×ó±ßÇøÓò // ½«> xµÄÔªËØ½»»»µ½ÓÒ±ßÇøÓò while (true) {

while (a[++i] x); if (i >= j) break; Swap(a[i], a[j]); } a[p] = a[j]; a[j] = x; return j; }

3. ÓÃ̰ÐÄËã·¨Çó½â×îÓÅ×°ÔØÎÊÌâ¡£ ×îÓÅ×°ÔØÎÊÌâ P95 ¿Î¼þµÚ4ÕÂ(2)µÚ3-8Ò³

template

void Loading(int x[], Type w[], Type c, int n) {

int *t = new int [n+1]; Sort(w, t, n);

for (int i = 1; i <= n; i++) x[i] = 0; for (int j = 1; j <= n && w[t[j]] <= c; j++) {x[t[i]] = 1; c -= w[t[j]];} }

4. ÓûØËÝ·¨Çó½â0-1±³°ü/Åú´¦Àí×÷Òµµ÷¶È /×î´óÍÅÎÊÌ⣬Ҫ»á»­½â¿Õ¼äÊ÷¡£ Àý1£ºÓûØËÝ·¨Çó½â0-1±³°ü P133¿Î¼þµÚ5ÕÂ(2)µÚ24-38Ò³ template class Knap {

private:

Typep Bound(int i); //¼ÆËãÉϽç void Backtrack(int i); Typew c; //±³°üÈÝÁ¿ int n; //ÎïÆ·Êý

Typew *w; //ÎïÆ·ÖØÁ¿Êý×é Typep *p; //ÎïÆ·¼ÛÖµÊý×é Typew cw; //µ±Ç°ÖØÁ¿ Typep cp; //µ±Ç°¼ÛÖµ Typep bestp; //µ±Ç°×îÓżÛÖµ };

void Knap::Backtrack(int i) { if(i>n) { bestp=cp; return; } if(cw+w[i]<=c) //½øÈë×ó×ÓÊ÷ { cw+=w[i]; cp+=p[i]; Backtrack(i+1); cw-=w[i]; cp-=p[i]; }

if(Bound(i+1)>bestp) //½øÈëÓÒ×ÓÊ÷ Backtrack(i+1); }

Typep Knap::Bound(int i) {

Typew cleft=c-cw; //Ê£ÓàµÄ±³°üÈÝÁ¿ Typep b=cp; //bΪµ±Ç°¼ÛÖµ //ÒÀ´Î×°Èëµ¥Î»ÖØÁ¿¼ÛÖµ¸ßµÄÕû¸öÎïÆ·

while(i<=n&&w[i]<=cleft)

{ cleft-=w[i]; b+=p[i]; i++; } if(i<=n) //×°ÈëÎïÆ·µÄÒ»²¿·Ö b+=p[i]*cleft/w[i]; return b; //·µ»ØÉϽç }

class Object //ÎïÆ·Àà {

friend int Knapsack(int *,int *,int,int); public:

int operator <(Object a) const {

return (d>=a.d); }

int ID; //ÎïÆ·±àºÅ float d; //µ¥Î»ÖØÁ¿¼ÛÖµ };

Typep Knapsack( Typep p[],Typew w[],Typew c,int n) { //ΪTypep Knapsack³õʼ»¯ Typew W=0; //×ÜÖØÁ¿ Typep P=0; //×ܼÛÖµ

Object* Q=new Object[n]; //´´½¨ÎïÆ·Êý×飬ϱê´Ó0¿ªÊ¼ for(int i=1;i<=n;i++) //³õʼÎïÆ·Êý×éÊý¾Ý { Q[i-1].ID=i;

Q[i-1].d=1.0*p[i]/w[i]; P+=p[i]; W+=w[i]; }

if(W<=c) //ÄÜ×°ÈëËùÓÐÎïÆ· return P;

if(W<=c) //ÄÜ×°ÈëËùÓÐÎïÆ· return P;

QuickSort(Q,0,n-1); //ÒÀÎïÆ·µ¥Î»ÖØÁ¿¼ÛÖµ·ÇÔöÅÅÐò

Knap K; K.p=new Typep[n+1]; K.w=new Typew[n+1]; for(int i=1;i<=n;i++)

{ K.p[i]=p[Q[i-1].ID]; K.w[i]=w[Q[i-1].ID]; } K.cp=0; K.cw=0; K.c=c; K.n=n; K.bestp=0; K.Backtrack(1); delete[] Q; delete[] K.w; delete[] K.p; return K.bestp; }

Àý2£ºÅú´¦Àí×÷Òµµ÷¶È ¿Î¼þµÚ5ÕÂ(2)P2-5ÎÊÌâÃèÊö,¿Î±¾P125-127 ½â¿Õ¼ä£ºÅÅÁÐÊ÷ Ëã·¨ÃèÊö£º class Flowshop {

static int [][] m, // ¸÷×÷ÒµËùÐèµÄ´¦Àíʱ¼ä [] x, // µ±Ç°×÷Òµµ÷¶È [] bestx, // µ±Ç°×îÓÅ×÷Òµµ÷¶È

[] f2, // »úÆ÷2Íê³É´¦Àíʱ¼ä f1, // »úÆ÷1Íê³É´¦Àíʱ¼ä f, // Íê³Éʱ¼äºÍ

bestf, // µ±Ç°×îÓŵÄÍê³Éʱ¼äºÍ n; // ×÷ÒµÊý static void Backtrack(int i) {

if (i > n)

{ for (int j = 1; j <= n; j++) bestx[j] = x[j]; bestf = f; } else

for (int j = i; j <= n; j++) {

f1+=m[x[j]][1];//µÚj¸ö×÷ÒµÔÚµÚһ̨»úÆ÷ÉÏËùÐèʱ¼ä f2[i]=((f2[i-1]>f1)?f2[i-1]:f1)+m[x[j]][2]; f+=f2[i];

if (f < bestf) //Ô¼Êøº¯Êý

{ Swap(x[i], x[j]); Backtrack(i+1); Swap(x[i], x[j]); f1 - =m[x[j]][1]; f - =f2[i]; } }

}