zoukankan      html  css  js  c++  java
  • 14.背包问题[递归实现]

    /*------------完整代码@映雪-------------*/
    /*初始化一组数据,省却输入,方便调试*/
    
    #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;
    }
  • 相关阅读:
    修改 MyEclipse 中的 jsp 和 servlet 模板
    javaWeb 数据库连接池连接数据库
    发现一个类的方法不够用时,可以使用的3种方法可以增强
    使用 greenDao 框架 操作数据库
    Android之使用Volley框架在ListView中加载大量图片
    js日期选择控件
    mysql 乱码问题
    java 使用反射技术解耦
    javaWeb 使用jsp开发 html过滤标签
    javaWeb 使用jsp开发 foreach 标签
  • 原文地址:https://www.cnblogs.com/tinaluo/p/5297713.html
Copyright © 2011-2022 走看看