Ëã·¨Éè¼ÆÓë·ÖÎöʵÑ鱨¸æ×ÊÁÏ ÏÂÔØ±¾ÎÄ

ÉèËù¸ø0-1±³°üÎÊÌâµÄ×ÓÎÊÌâ

µÄ×îÓÅֵΪm(i£¬j)£¬¼´m(i£¬j)ÊDZ³°üÈÝÁ¿Îªj£¬¿ÉÑ¡ÔñÎïÆ·Îªi£¬i+1£¬¡­£¬nʱ0-1±³°üÎÊÌâµÄ×îÓÅÖµ¡£ÓÉ0-1±³°üÎÊÌâµÄ×îÓÅ×ӽṹÐÔÖÊ£¬¿ÉÒÔ½¨Á¢¼ÆËãm(i£¬j)µÄµÝ¹éʽ:

×¢:(3.4.3)ʽ´Ëʱ±³°üÈÝÁ¿Îªj£¬¿ÉÑ¡ÔñÎïÆ·Îªi¡£´ËʱÔÚ¶Ôxi×÷³ö¾ö²ßÖ®ºó,ÎÊÌâ´¦ÓÚÁ½ÖÖ״̬֮һ:

(1)±³°üÊ£ÓàÈÝÁ¿ÊÇj,û²úÉúÈκÎÐ§Òæ£» (2)Ê£ÓàÈÝÁ¿j-wi,Ð§ÒæÖµÔö³¤ÁËvi £»

1.3Ëã·¨ÃèÊö

int m[100][100];//ǰi¸öÎïÆ·×°ÈëÈÝÁ¿ÎªjµÄ±³°üÖлñµÃµÄ×î´ó¼ÛÖµ int s;//»ñµÃµÄ×î´ó¼ÛÖµ int w[15];//ÎïÆ·µÄÖØÁ¿ int v[15];//ÎïÆ·µÄ¼ÛÖµ

int x[15];//ÎïÆ·µÄѡȡ״̬£¬1±íʾ±»Ñ¡ÖÐ 0±íʾδѡÖÐ int n,i;

int c;//±³°ü×î´óÈÝÁ¿

int max(int a,int b)//»ñµÃ×î´óÖµ int min(int a,int b)//»ñµÃ×îСֵ

void KnapSack(int n,int w[],int v[],int c)//±³°üÎÊÌâÖ÷Ëã·¨

ÏÈΪm[n][j] ³õʼ»¯³õֵȻºó¸ù¾ÝµÝ¹é·½³Ìʽ½øÐÐÇî¾ÙµÝ¹éÖ±µ½ m[1][c]£¬ m[1][c] ¼´ÎªËù»ñµÃµÄ×î´ó¼ÛÖµ¡£

void Traceback(int n,int w[],int x[],int c)//»ØËÝËã·¨£¬ÒÀ´Î±ê×¢±»Ñ¡ÖеÄÎïÆ·

ͨ¹ýÒ»¸öÑ­»·¹ý³Ì¼ìÑé×°ÈëµÚi¸öÎïÆ·Óë×°Èëi+1¸öÎïÆ·µÄ¼ÛÖµÈç¹ûÏàͬ£¬Ôòx[i]=0¡£

1.4³ÌÐòʵÏÖ¼°³ÌÐò½ØÍ¼ 1.4.1³ÌÐòÔ´Âë

#include using namespace std;

int m[100][100];//ǰi¸öÎïÆ·×°ÈëÈÝÁ¿ÎªjµÄ±³°üÖлñµÃµÄ×î´ó¼ÛÖµ int max(int a,int b)

4 {

if(a>=b) return a; else return b; }

int min(int a,int b) {

if(a>=b) return b; else return a; }

void KnapSack(int n,int w[],int v[],int c) { int i,j;

int jMax=min(w[n]-1,c); for(j=0;j<=jMax;j++) m[n][j]=0; for(j=w[n];j<=c;j++) m[n][j]=v[n]; for(i=n-1;i>1;i--) {

jMax=min(w[i]-1,c);

for(j=0;j<=jMax;j++) m[i][j]=m[i+1][j]; for(j=w[i];j

m[i][j]=max(m[i+1][j],m[i+1][j-w[i]]+v[i]); }

m[1][c]=m[2][c]; if(c>=w[1])

m[1][c]=max(m[1][c],m[2][c-w[1]]+v[1]); }

void Traceback(int n,int w[],int x[],int c) { int i;

for(i=1;i

if(m[i][c]==m[i+1][c]) x[i]=0; else{x[i]=1;c-=w[i];} x[n]=(m[n][c])?1:0; } int main()

1.4.2³ÌÐò½ØÍ¼

{

int s;//»ñµÃµÄ×î´ó¼ÛÖµ int w[15];//ÎïÆ·µÄÖØÁ¿ int v[15];//ÎïÆ·µÄ¼ÛÖµ int x[15];//ÎïÆ·µÄѡȡ״̬ int n,i;

int c;//±³°ü×î´óÈÝÁ¿

cout <<\ÇëÊäÈë±³°üµÄ×î´óÈÝÁ¿:\ cin>>c;

cout<<\ÊäÈëÎïÆ·Êý:\\n\ cin>>n;

cout<<\Çë·Ö±ðÊäÈëÎïÆ·µÄÖØÁ¿:\ for(i=1;i<=n;i++) cin>>w[i];

cout<<\Çë·Ö±ðÊäÈëÎïÆ·µÄ¼ÛÖµ:\ for(i=1;i<=n;i++) cin>>v[i];

KnapSack(n,w,v,c); Traceback(n,w,x,c); s=m[1][c];

cout<<\×î´óÎïÆ·¼ÛֵΪ:\ cout<

cout<<\Ñ¡ÖеÄÎïÆ·Îª£º\ for(i=1;i<=n;i++) cout<

return 0;

£ý

5

1.5ѧϰ»ò³ÌÐòµ÷ÊÔÐĵÃ

ÀûÓö¯Ì¬¹æ»®Çó½â0-1±³°üÎÊÌâµÄ¸´ÔÓ¶ÈΪ0(min{nc,2n}¡£¶¯Ì¬¹æ»®Ö÷ÒªÊÇÇó½â×îÓžö²ßÐòÁУ¬µ±×îÓžö²ßÐòÁÐÖаüº¬×îÓžö²ß×ÓÐòÁÐʱ£¬¿É½¨Á¢¶¯Ì¬¹æ»®µÝ¹é·½³Ì£¬Ëü¿ÉÒÔ°ïÖú¸ßЧµØ½â¾öÎÊÌâ¡£

6

×÷Òµ2 0-1±³°üÎÊÌâµÄ»ØËÝËã·¨

1.1Ëã·¨Ó¦Óñ³¾°

±³°üÎÊÌâÊÇÒ»¸öÔÚÔ˳ïѧÁìÓòÀï³£¼ûµÄµäÐÍNP-CÄÑÌ⣬ҲÊÇËã·¨Éè¼Æ·ÖÎöÖеľ­µäÎÊÌ⣬¶Ô¸ÃÎÊÌâµÄÇó½â·½·¨µÄÑо¿ÎÞÂÛÊÇÔÚÀíÂÛÉÏ,»¹ÊÇÔÚʵ¼ùÖж¼¾ßÓÐÖØÒªÒâÒå¡£¶ÔÕâ¸öÎÊÌâµÄÇó½âÒѾ­Ñо¿³öÁ˲»Éٵľ­µä·½·¨£¬¶Ô¸ÃÎÊÌâµÄ̽Ë÷ºÍÓ¦ÓÃÑо¿Ò»Ö±ÔÚ½øÐС£ÔÚÏȽøÀíÂÛÖ¸µ¼Ï£¬Çó½â0-1±³°üÎÊÌâ¾ßÓпÆÑ§¡¢¸ßЧ¡¢¾­¼Ã¡¢Áé»î¡¢·½±ãµÈÏÔÖøÌØµã¡£

ÄÇôҪ½â¾ö±³°üÎÊÌ⣬Ê×ÒªµÄǰÌá¾ÍÊÇÉè¼Æ³öºÃµÄËã·¨£¬ÏëÇóµÃ±³°üÎÊÌâµÄ½â£¬¾ÍÒªÏÈÉè¼Æ³öËã·¨,±¾ÎIJÉÓûØËÝ·¨¶Ô±³°üÎÊÌâ¸ø³ö¾ßÌåËã·¨Éè¼ÆºÍʵÏÖ¹ý³Ì¡£ÈçºÎ½«±³°üÎÊÌâÓ¦ÓÃÓÚʵ¼ÊÎÊÌâÖУ¬ÓÐÕë¶ÔÐÔµØÉè¼ÆÊʺÏÇó½âʵ¼Ê0-1±³°üÎÊÌâµÄËã·¨£¬²¢ºÜºÃµØ½â¾öʵ¼ÊÎÊÌ⣬ÊǼÆËã»ú¹¤×÷Õß²»¶Ï˼Ë÷¡¢Ñо¿µÄÒ»¸öÁìÓò¡£

2.2Ëã·¨Ô­Àí 2.2.1 ÎÊÌâÃèÊö

ÎÊÌâµÄÒ»°ãÃèÊöÊÇ£ºÂÃÐÐÕß±³°üµÇɽ£¬±³°üµÄ×î´ó³ÐÖØÎªM£¬ÏÖÓÐn¸öÎïÆ·¿É¹©Ñ¡Ôñ×°Èë±³°ü£¬µÚi¸öÎïÆ·ÝºÁ¿Îªwi£¬¼ÛֵΪpi£¬¼Ù¶¨ÎïÆ·iµÄÒ»²¿·Öxi(0?xi?1)·ÅÈ˱³°ü£¬»ñµÃ¼ÛֵΪxipi£¬ÓÉÓÚ±³°ü×î´ó³ÐÖØÎªM£¬ÒªÇó×°ÈëÎïÆ·×ÜÖÊÁ¿²»¹ý³¬¹ýM£¬ÎÊÂÃÐÐÕßÓ¦¸ÃÈçºÎÑ¡ÔñÎïÆ·×°Èë±³°ü£¬Ê¹µÃ×°ÈëÎïÆ·µÄ¼ÛÖµ×ܺʹﵽ×î´óÖµ¡£

±³°üÎÊÌâµÄÊýѧÃèÊöÈçÏ£ºÒªÇóÕÒµ½Ò»¸önÔªÏòÁ¿(x1£¬x2¡­xn)£¬ÔÚÂú×ãÔ¼ÊøÌõ¼þ£º

???xiwi?MÇé¿öÏ£¬Ê¹µÃÄ¿±êº¯Êýmax?xi??0?x?1i?p£¬ÆäÖУ¬1?i?n£»M>0£»wi>0£»pi>0¡£

iÂú×ãÔ¼ÊøÌõ¼þµÄÈκÎÏòÁ¿¶¼ÊÇÒ»¸ö¿ÉÐн⣬¶øÊ¹µÃÄ¿±êº¯Êý´ïµ½×î´óµÄÄǸö¿ÉÐнâÔòΪ×îÓÅ

½â¡£

¸ø¶¨n ÖÖÎïÆ·ºÍ1¸ö±³°ü¡£ÎïÆ·i µÄÖØÁ¿ÊÇwi£¬Æä¼ÛֵΪpi£¬±³°üµÄÈÝÁ¿ÎªM¡£ÎÊÓ¦ÈçºÎ×°Èë±³°üÖеÄÎïÆ·£¬Ê¹µÃ×°È˱³°üÖÐÎïÆ·µÄ×ܼÛÖµ×î´ó£¿ÔÚÑ¡Ôñ×°È˱³°üµÄÎïÆ·Ê±£¬¶ÔÿÖÖÎïÆ·iÖ»ÓÐÁ½ÖÖÑ¡Ôñ£¬¼´×°Èë±³°ü¡¢²»×°Èë±³°ü¡£²»Äܽ«ÎïÆ·i ×°È˱³°ü¶à´Î£¬Ò²²»ÄÜÖ»×°È벿·ÖµÄÎïÆ·i¡£¸ÃÎÊÌâ³ÆÎª0-1±³°üÎÊÌâ¡£

0-1±³°üÎÊÌâµÄ·ûºÅ»¯±íʾÊÇ£¬¸ø¶¨M>0£¬ w i >0£¬ pi >0£¬1?i?n £¬ÒªÇóÕÒµ½Ò»¸önÔª0-1ÏòÁ¿ÏòÁ¿(x1£¬x2¡­xn)£¬ X i =0 »ò1 , 1?i?n, ʹµÃ

?xwii?M £¬¶øÇÒ?xip´ïµ½×î´ó¡£

i2.2.2Ëã·¨·ÖÎö

1¡¢ÎÊÌâµÄ½â¿Õ¼ä£ºÓ¦ÓûØËÝ·¨½âÎÊÌâʱ£¬Ê×ÏÈÓ¦Ã÷È·¶¨ÒåÎÊÌâµÄ½â¿Õ¼ä¡£ÎÊÌâµÄ½â¿Õ¼äÓ¦

7