动态规划解决01背包问题

动态规划解决01背包问题!
代码

#include<stdio.h>
int  c[10][100]; /* 对应每种情况的最大价值 */
int  w[10],p[10];
int  knapsack( int  m, int  n)
{
  int  i,j,x[10];  // w为物品重量,p为价值
  for (i=1;i<n+1;i++)
        scanf("\n%d%d",&w[i],&p[i]);
  for (i=0;i<10;i++)
       for (j=0;j<100;j++)
           c[i][j]=0; /* 初始化数组 */
  for (i=1;i<n+1;i++)
       for (j=1;j<m+1;j++)
           {
             if (w[i]<=j)  /* 如果当前物品的重量小于背包所能承载的重量 */
                     {
                       if (p[i]+c[i-1][j-w[i]]>c[i-1][j])

                            /* 如果本物品的价值加上背包剩下的空间能放的物品的价值 */

                          /* 大于上一次选择的最佳方案则更新c[i][j] */
                            c[i][j]=p[i]+c[i-1][j-w[i]];
                             else
                            c[i][j]=c[i-1][j];
                     }
               else  c[i][j]=c[i-1][j];
            }
            printf("\n");

     int  contain = m; 
     for ( int  i=n;i>0;--i)
    {
         if (c[i][contain] == c[i-1][contain]) // 未放入第i个物品,contain表示当前背包的承受重量
           x[i-1] = 0;   // 考虑:f[i][j] = max{ f[i-1][j] 和 f[i-1][j - w[i]] + v[i] }, if ( f[i][j] == f[i-1][j] )
         else             // 则说明物品i未放入;否则物品i 放入了背包中,最大承重量也相应减去w[i]
        {
         x[i-1] = 1;
         contain -= w[i];  //  放上了第i个物品,当前背包的重量要减去相应的物品i的重量,回溯
        }
    }
        for (i=0;i<n;i++)
    {
        printf("%d ",x[i]);  // 1表示放入,0表示未放入
    }
 printf("\n");
  return (c[n][m]);

}


int  main()    
{
     int  m,n,i,j;
    scanf("%d %d",&m,&n);
    printf("Input the weight and value:\n");
    printf("%d\n",knapsack(m,n));
     return  0;
}

// 测试数据:5 4
// 2 12
// 1 10
// 3 20
// 2 15
// 结果:1 1 0 1  最大价值:37

你可能感兴趣的:(动态规划解决01背包问题)