背包非递归解法

 10:  #include <iostream>
  11:  #include <iomanip>
  12:  using namespace std;
  13:   
  14:   
  15:   
  16:  const int n = 4;
  17:  const int W = 5;
  18:   
  19:  int c[n+1][W+1];
  20:   
  21:  /*
  22:  input:
  23:      int v[]:物品的价值数组;
  24:      int w[]:物品重量数组;
  25:      int n:物品个数;
  26:      int W:背包容量;
  27:  
  28:  */
  29:  void knapsack_0_1_problem(int v[],int w[], int n, int W)
  30:  {
  31:      c[0][0] = 0;
  32:      //c[i][j]表示,将i个物品放入容量为j的背包中所具有的价值最大值;
  33:      for (int i=1; i<n; i++)
  34:      {
  35:          c[i][0] = 0;//如果背包容量为0,那么i个物品放入该背包的最优值都是0;
  36:      }
  37:      for (int j=1; j<W; j++)
  38:      {
  39:          c[0][j] = 0;//如果物品的数量为0,那么将0个物品放入大小为j的背包中的最优值就是0;
  40:      }
  41:   
  42:      //下面开始使用递归公式求解最优值
  43:      for(int i=1; i<=n;i++)
  44:      {
  45:          for (int ww=1; ww<=W; ww++)
  46:          {
  47:              //如果当前物品的重量大于背包的体积
  48:              if (w[i]>ww)
  49:              {
  50:                  c[i][ww] = c[i-1][ww];
  51:              }
  52:              else
  53:              {
  54:                  if (c[i-1][ww] > (v[i]+c[i-1][ww-w[i]]))
  55:                  {
  56:                      c[i][ww] = c[i-1][ww];
  57:                  }
  58:                  else
  59:                  {
  60:                      c[i][ww] = v[i]+c[i-1][ww-w[i]];
  61:                  }
  62:              }
  63:          }
  64:   
  65:      }
  66:  }
  67:   
  68:   
  69:   
  70:  int main()
  71:  {
  72:   
  73:      //v[]和w[]分别为价值数组和重量数组,并且下标都是从1开始算的,第0个元素设为-999;
  74:      //这里要下标必须从1开始,因为在迭代的过程当中有c[i][j]=max{c[i-1][j], c[i-1][j-w[i]]},
  75:      //如果元素的下标从0开始取的话,我们在遍历物品价值和重量数组的时候,就会有c[0][j]=max{c[i-1][j], c[-1][j-w[0]]},这里就会出现数组下标为0的情况,
  76:      //所以下标选择从1开始。
  77:      int v[n+1] = {-999, 6, 7, 14, 8};
  78:      int w[n+1] = {-999, 1, 2, 4, 5};
  79:   
  80:      knapsack_0_1_problem(v,w,n,W);
  81:   
  82:      for (int i=0; i<=n; i++)
  83:      {
  84:          for (int j=0; j<=W; j++)
  85:          {
  86:              cout << setw(3) << c[i][j];
  87:          }
  88:          cout << endl;
  89:      }
  90:   
  91:      int remainspace = W;//该变量用来记录背包当前还剩余的容量
  92:   
  93:      //以下过程,从c[n][W]开始向前寻找,那些物品被选择装进背包中;
  94:      //判断条件为:如果第n个物品被选择装进背包中,那么c[n][W]=c[n-1][W-w[n]] + v[n];此时reminspace将变为remainspace-w[n]
  95:      //否则物品n没有被选择,此时背包剩余的容量remainspace不会发生改变;
  96:      //按照上述方法一直往前找,即可以将所有装入背包中物品找到。
  97:   
  98:      for(int i=n; i>=1; i--)
  99:      {
 100:   
 101:          if (remainspace >= w[i])
 102:          {
 103:              
 104:              if ((c[i][remainspace]-c[i-1][remainspace-w[i]]==v[i]))
 105:              {
 106:                  cout << "item " << i << " is selected!" << endl;

107: remainspace = remainspace - w[i];//如果第i个物品被选择,那么背包剩余容量将减去第i个物品的重量 ;

//,2012年5月2日21:45:33 修改为remainspace - w[i];以前为 W-w[i];

 108:              }
 109:          }
 110:                  
 111:      }
 112:   
 113:      cout << "Maximum values is " << c[n][W] << endl;
 114:   
 115:      return 0;
 116:  }


 10:  #include <iostream>
  11:  #include <iomanip>
  12:  using namespace std;
  13:   
  14:   
  15:   
  16:  const int n = 4;
  17:  const int W = 5;
  18:   
  19:  int c[n+1][W+1];
  20:   
  21:  /*
  22:  input:
  23:      int v[]:物品的价值数组;
  24:      int w[]:物品重量数组;
  25:      int n:物品个数;
  26:      int W:背包容量;
  27:  
  28:  */
  29:  void knapsack_0_1_problem(int v[],int w[], int n, int W)
  30:  {
  31:      c[0][0] = 0;
  32:      //c[i][j]表示,将i个物品放入容量为j的背包中所具有的价值最大值;
  33:      for (int i=1; i<n; i++)
  34:      {
  35:          c[i][0] = 0;//如果背包容量为0,那么i个物品放入该背包的最优值都是0;
  36:      }
  37:      for (int j=1; j<W; j++)
  38:      {
  39:          c[0][j] = 0;//如果物品的数量为0,那么将0个物品放入大小为j的背包中的最优值就是0;
  40:      }
  41:   
  42:      //下面开始使用递归公式求解最优值
  43:      for(int i=1; i<=n;i++)
  44:      {
  45:          for (int ww=1; ww<=W; ww++)
  46:          {
  47:              //如果当前物品的重量大于背包的体积
  48:              if (w[i]>ww)
  49:              {
  50:                  c[i][ww] = c[i-1][ww];
  51:              }
  52:              else
  53:              {
  54:                  if (c[i-1][ww] > (v[i]+c[i-1][ww-w[i]]))
  55:                  {
  56:                      c[i][ww] = c[i-1][ww];
  57:                  }
  58:                  else
  59:                  {
  60:                      c[i][ww] = v[i]+c[i-1][ww-w[i]];
  61:                  }
  62:              }
  63:          }
  64:   
  65:      }
  66:  }
  67:   
  68:   
  69:   
  70:  int main()
  71:  {
  72:   
  73:      //v[]和w[]分别为价值数组和重量数组,并且下标都是从1开始算的,第0个元素设为-999;
  74:      //这里要下标必须从1开始,因为在迭代的过程当中有c[i][j]=max{c[i-1][j], c[i-1][j-w[i]]},
  75:      //如果元素的下标从0开始取的话,我们在遍历物品价值和重量数组的时候,就会有c[0][j]=max{c[i-1][j], c[-1][j-w[0]]},这里就会出现数组下标为0的情况,
  76:      //所以下标选择从1开始。
  77:      int v[n+1] = {-999, 6, 7, 14, 8};
  78:      int w[n+1] = {-999, 1, 2, 4, 5};
  79:   
  80:      knapsack_0_1_problem(v,w,n,W);
  81:   
  82:      for (int i=0; i<=n; i++)
  83:      {
  84:          for (int j=0; j<=W; j++)
  85:          {
  86:              cout << setw(3) << c[i][j];
  87:          }
  88:          cout << endl;
  89:      }
  90:   
  91:      int remainspace = W;//该变量用来记录背包当前还剩余的容量
  92:   
  93:      //以下过程,从c[n][W]开始向前寻找,那些物品被选择装进背包中;
  94:      //判断条件为:如果第n个物品被选择装进背包中,那么c[n][W]=c[n-1][W-w[n]] + v[n];此时reminspace将变为remainspace-w[n]
  95:      //否则物品n没有被选择,此时背包剩余的容量remainspace不会发生改变;
  96:      //按照上述方法一直往前找,即可以将所有装入背包中物品找到。
  97:   
  98:      for(int i=n; i>=1; i--)
  99:      {
 100:   
 101:          if (remainspace >= w[i])
 102:          {
 103:              
 104:              if ((c[i][remainspace]-c[i-1][remainspace-w[i]]==v[i]))
 105:              {
 106:                  cout << "item " << i << " is selected!" << endl;
 107:                  remainspace = remainspace - w[i];//如果第i个物品被选择,那么背包剩余容量将减去第i个物品的重量 ;

                                                        //,2012年5月2日21:45:33 修改为remainspace - w[i];以前为 W-w[i];

 108:              }
 109:          }
 110:                  
 111:      }
 112:   
 113:      cout << "Maximum values is " << c[n][W] << endl;
 114:   
 115:      return 0;
 116:  }



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值