ÉèËù¸ø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
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