動態規劃之01揹包問題

 

  1. #include  
  2. using namespace std;  
  3. int c[10][100];  
  4. int Knapsack(int n,int m)  
  5. {  
  6.     int i,j;  
  7.     int w[10],v[10];  
  8.     for(i=1;i<=n;i++)  
  9.         scanf("%d%d",&w[i],&v[i]);  
  10.     for(i=0;i<10;i++)  
  11.         for(j=0;j<100;j++)  
  12.             c[i][j]=0;  
  13.     for(i=1;i<=n;i++)  
  14.         for(j=1;j<=m;j++)  
  15.         {  
  16.             if(w[i]<=j)  
  17.             {  
  18.                   
  19.                 if(c[i-1][j]
  20.                     c[i][j]=v[i]+c[i-1][j-w[i]];  
  21.                 else//否則不更新  
  22.                     c[i][j]=c[i-1][j];  
  23.             }  
  24.             else  
  25.                 c[i][j]=c[i-1][j];  
  26.         }  
  27.         return c[n][m];  
  28. }  
  29. int main()  
  30. {  
  31.     int n,m;  
  32.     printf("input m and n/n");  
  33.     scanf("%d%d",&m,&n);  
  34.     printf("%d",Knapsack(n,m));  
  35.     printf("/n");  
  36.     int i,j;  
  37.     for(i=0;i<=n;i++)  
  38.     {  
  39.         for(j=0;j<=m;j++)  
  40.             printf("=",c[i][j]);  
  41.         printf("/n");  
  42.     }  
  43.     return 0;  
  44. }  
  45.   

 

上面的算法沒有提供找最優解序列的方法,下面給出找最有解序列的代碼

 

[c-sharp] view plaincopy
  1. #include  
  2. using namespace std;  
  3. int c[10][100];  
  4. int x[10];//存放最優解  
  5. int Knapsack(int n,int m,int w[],int v[])  
  6. {  
  7.     int i,j;  
  8.     for(i=0;i<10;i++)  
  9.         for(j=0;j<100;j++)  
  10.             c[i][j]=0;  
  11.     for(i=1;i<=n;i++)  
  12.         for(j=1;j<=m;j++)  
  13.         {  
  14.             if(w[i]<=j)  
  15.             {  
  16.                   
  17.                 if(c[i-1][j]
  18.                 {  
  19.                     c[i][j]=v[i]+c[i-1][j-w[i]];  
  20.                 }  
  21.                 else//否則不更新  
  22.                 {  
  23.                     c[i][j]=c[i-1][j];  
  24.                 }  
  25.             }  
  26.             else  
  27.             {  
  28.                 c[i][j]=c[i-1][j];  
  29.             }  
  30.         }  
  31.         return c[n][m];//矩陣的最後一個爲最優解。  
  32. }  
  33.   
  34. void Trackback(int c[][100],int w[],int m,int n)  
  35. {  
  36.     int i;  
  37.     for(i=n;i>0;i--)  
  38.     {  
  39.         if(c[i][m]==c[i-1][m])//表示序號爲i的物品沒有被裝入揹包  
  40.             x[i]=0;  
  41.         else  
  42.         {  
  43.             x[i]=1;  
  44.             m-=w[i];  
  45.         }  
  46.     }  
  47. }  
  48.   
  49. int main()  
  50. {  
  51.     int n,m;  
  52.     int i,j;  
  53.     printf("input m and n/n");  
  54.     scanf("%d%d",&m,&n);  
  55.     int w[10],v[10];  
  56.     for(i=1;i<=n;i++)  
  57.         scanf("%d%d",&w[i],&v[i]);  
  58.   
  59.     printf("%d",Knapsack(n,m,w,v));  
  60.     printf("/n");  
  61.   
  62.     for(i=0;i<=n;i++)  
  63.     {  
  64.         for(j=0;j<=m;j++)  
  65.             printf("=",c[i][j]);  
  66.         printf("/n");  
  67.     }  
  68.     Trackback(c,w,m,n);//找最優解  
  69.     for(i=1;i<=n;i++)  
  70.         cout<<x[i]<<" ";  
  71.     cout<<endl;  
  72.     return 0;  
  73. }  
  74.   


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章