~$ 存档

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
/*------------完整代码@映雪-------------*/
/*初始化一组数据,省却输入,方便调试*/

#include <iostream>
using namespace std;
typedef struct
{
    int value[5];/*价值表*/
    int weight[5];/*重量表*/   
    int num;/*数量*/
    int limitw;/*最大重量*/
    int select[5];
}Goods;
int maxvalue=0,totalvalue=115;//方案最大价值,物品总价值 
int select1[5]={0};/*全局*/
void backpack(Goods &g, int i, int tw, int tv)//参数为物品i,当前选择已经达到的重量和tw,本方案可能达到的总价值 
{
   int k;
   if (tw + g.weight[i] <= g.limitw)//将物品i包含在当前方案,且重量小于等于限制重量 
   {
      select1[i] = 1; //选中第i个物品 
      if (i < g.num - 1) //若物品i不是最后一个物品 
         backpack(g, i + 1, tw + g.weight[i], tv); //递归调用,继续添加下一物品 
      else //若已到最后一个物品 
      {
         for (k = 0; k < g.num; ++k) //将状态标志复制到option数组中 
            g.select[k] = select1[k];
         maxvalue = tv; //保存当前方案的最大价值 
      }
   }
   select1[i] = 0; //取消物品i的选择状态 
   if (tv - g.value[i] > maxvalue)//若物品总价值减去物品i的价值还大于maxv方案中已有的价值,说明还可以继续向方案中添加物品 
   {
      if (i < g.num - 1) //若物品i不是最后一个物品 
         backpack(g, i + 1, tw, tv - g.value[i]); //递归调用,继续加入下一物品 
      else //若已到最后一个物品 
      {
           for (k = 0; k < g.num; ++k) //将状态标志复制到option数组中 
            {
                g.select[k] = select1[k];
            }
         maxvalue = tv - g.value[i]; //保存当前方案的最大价值(从物品总价值中减去物品i的价值)
      }
   }
}
int main()
{
   int sumweight=0;  
   Goods g={{40,12,7,8,48},{5,2,1,1,6},5,8,{0}};/*初始化一组数据*/  
   cout<<"背包最大能装的重量为:"<<g.limitw<<endl;
   for (int i = 0; i < g.num; i++)
   cout<<""<<i+1<<"号物品重"<<g.weight[i]<<" "<<"价值为:"<<g.value[i]<<endl;
   backpack(g,0,0,totalvalue);
   cout<<"计算结果为:"<<endl;
   for (i = 0; i < g.num; ++i)
      if (g.select[i])
      {
         cout<<""<<i+1<<"号物品重"<<g.weight[i]<<" "<<"价值为:"<<g.value[i]<<endl;
         sumweight+=g.weight[i];
      }     
   cout<<"总重量为:"<<sumweight<< "总价值为:"<<maxvalue<<endl;
   return 0;
}

 

posted on 2016-03-20 14:26  LuoTian  阅读(807)  评论(0编辑  收藏  举报