zoukankan      html  css  js  c++  java
  • 一般背包问题 贪心法

    #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;
    }
    

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

  • 相关阅读:
    PAT Basic 1077 互评成绩计算 (20 分)
    PAT Basic 1055 集体照 (25 分)
    PAT Basic 1059 C语言竞赛 (20 分)
    PAT Basic 1072 开学寄语 (20 分)
    PAT Basic 1049 数列的片段和 (20 分)
    蓝桥杯BASIC-13 数列排序
    蓝桥杯入门——3.序列求和
    蓝桥杯入门——2.圆的面积
    蓝桥杯入门——1.Fibonacci数列
    树的总结(遍历,BST,AVL原型,堆,练习题)
  • 原文地址:https://www.cnblogs.com/Tobyuyu/p/4965426.html
Copyright © 2011-2022 走看看