0-1背包问题之动态规划解决算法(二)


#include<stdio.h>                                                             
#include<stdlib.h>  
 int m[6][5][8];  //m[i][j][k]表示背包容量为j,背包体积为k,可选物品为i,i+1,i+2.....,n时背包问题的最优解  
 int getmin(int x,int y)  
 {  
         if(x > y)  
                return y;  
         else  return x;  
 }    
int getmax(int x,int y)  
 {  
         if(x > y)  
                 return x;  
        else return y;  
 }  
 void Traceback(int w[],int b[] ,int c,int d,int n,int x[])  
 {  
      int i,j;  
      for( i = 1; i < n ; i++)  
       {  
            if(m[i][c][d] == m[i+1][c][d])  
            x[i] = 0;  
           else { x[i] = 1; c = c-w[i]; d = d-b[i] ;}  
      }  
      x[n] = (m[n][c][d]) ? 1:0;  
      for(j = 1; j <= n; j++)  
        printf("%d  ",x[j]);  
       printf("\n");  
 }  
 void Knapsack(int *value , int *weight , int *b , int contain ,int d, int n     )  
 {  
         int i,k;  
         int j = 0;  
         int x[6] = {0};         
          //先处理记录表格中的最后一行,  
         for(j = 0; j <= contain; j++)  
           for(k = 0; k <= d ; k++)  
            {  
                    if(weight[n] <= j && b[n] <= k)  
                                m[n][j][k] = value[n];  
                    else  
                                m[n][j][k] = 0;  
            } 
			
		 //循环处理记录表格中的其他行,	 
         for(i = n-1 ; i > 1; i--)  
         {  
               for(j = 0; j <= contain; j++)  
                   for(k = 0; k <= d ; k++)    
                   {     
                          if(weight[i] <= j && b[i] <= k)                               
                                m[i][j][k] = getmax(m[i+1][j][k] , m[i+1][j-weight[i]][k - b[i]] + value[i] );  
                          else  
                              m[i][j][k] = m[i+1][j][k];              
                   }  
        }  
        
        //处理记录表格中的第一行,
        m[1][contain][d] = m[2][contain][d];  
        if(contain >= weight[1] && d >= b[1])  
                m[1][contain][d] = getmax(m[1][contain][d] , m[2][contain - weight[1]][d - b[1]]+value[1]);  
         printf("the biggest value is %d\n",m[1][contain][d]);   
        Traceback(weight, b ,contain,d,n,x);       
 }  
int main()  
 {  
        int n = 5;   //物品数量  
        int contain = 4;  //背包容量  
         int d = 7;  //背包容积  
         int weight[6] = {0,5,2,6,5,4}; //物品重量  
         int value[6] = {0,2,3,5,4,6};  //物品价值  
         int b[6] = {0,2,2,5,1,4};  //物品体积  
        Knapsack(value , weight ,b , contain , d , n);  
        return 0;  
  
}   




猜你喜欢

转载自blog.csdn.net/qq_40685275/article/details/80155356