• 一般背包问题 贪心法


    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    using namespace std;
    
    struct goodinfo
    {
       float p; //物品效益
       float v; //物品价值
       float w; //物品重量
       float X; //物品该放的数量
       int flag; //物品编号
    }; //物品信息结构体
    
    void Insertionsort(goodinfo goods[],int n)
    {
       int j,i;
       for(j=2;j<=n;j++)
       {
          goods[0]=goods[j];
          i=j-1;
          while (goods[0].p>goods[i].p)
          {
             goods[i+1]=goods[i];
             i--;
          }
          goods[i+1]=goods[0];
       }
    }  //按物品效益,重量比值做升序排列
    
    void bag(goodinfo goods[],float M,int n)
    {
         float cu;
         int i,j;
         for(i=1;i<=n;i++)  goods[i].X=0;
         cu=M;  //背包剩余容量
         for(i=1;i<n;i++)
         {
             if(goods[i].w>cu)//当该物品重量大与剩余容量跳出
                  break;
            goods[i].X=1;
            cu=cu-goods[i].w;//确定背包新的剩余容量
         }
         if(i<=n)
         goods[i].X=cu/goods[i].w;//该物品所要放的量
        //按物品编号做降序排列
        for(j=2;j<=n;j++)
        {
           goods[0]=goods[j];
           i=j-1;
           while(goods[0].flag<goods[i].flag)
           {
              goods[i+1]=goods[i];
              i--;
           }
           goods[i+1]=goods[0];
        }
        double sum=0.0;
        cout<<"最优解为:(";
        for(i=1;i<=n;i++)
        {
           if(i==1)
           cout<<goods[i].X;
           else
            cout<<","<<goods[i].X;
           if(goods[i].X!=0)
            sum+=goods[i].X*goods[i].v;
        }
        cout<<")"<<endl;
        cout<<"最优解值为:"<<sum<<endl;
    }
    int main()
    {
         cout<<"|---------运用贪心法解背包问题---------|"<<endl;
         cout<<"|--------------------------------------|"<<endl;
         int i,n;
         float M;
         goodinfo *goods;     //定义一个指针
         cout<<"请输入物品的总数量:";
         while(cin>>n)
         {
            goods=new struct goodinfo [n+1];
            cout<<"请输入背包的最大容量:";
            cin>>M;
            cout<<endl;
            cout<<"请输入"<<n<<"个背包的重量(空格分割):"<<endl;
            for(i=1;i<=n;i++)
            {
                goods[i].flag=i;
                cin>>goods[i].w;
            }
            cout<<"请输入"<<n<<"个背包的价值(空格分割):"<<endl;
            for(i=1;i<=n;i++)
            {
                cin>>goods[i].v;
                goods[i].p=goods[i].v/goods[i].w;   //得出物品的效益,重量比
            }
            Insertionsort(goods,n);
            bag(goods,M,n);
       }
       return 0;
    }
    

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    Web HTML 内容改变的触发事件方式
    Delphi Clipboard[2] SetTextBuf、GetTextBuf、AsText 文本操作
    Delphi 绘图TCanvas类[4] TBrush 参数及介绍
    Delphi Clipboard[3] HasFormat、Assign及Image图片的加载
    Delphi WinAPI Window Styles窗体风格
    Delphi Clipboard[1] 剪贴板 介绍
    Delphi WinAPI SetLayeredWindowAttributes设置分层窗口的不透明度和透明度颜色关键点
    C++基础入门
    mysql怎么导入sql文件
    解决ubuntu20.04下vi编辑器方向键和退格键问题
  • 原文地址:https://www.cnblogs.com/Tobyuyu/p/4965427.html
Copyright © 2020-2023  润新知