贪心算法训练(一)——部分背包问题

  • 问题描述
    • 有一个背包,背包容量是 M =150,有 7 个物品,物品可以分割成任意大小,要求尽可能让装入背包中的物品总价值最大,但不能超过总容量

      物品 A B C D E F G
      重量 35 30 60 50 40 10 25
      价值 10 40 30 50 35 40 30
  • 问题分析
    • 选择性价比最高的,即算出单位价值,并按从大到小排序,依次放入背包,超重就不放,没超就继续放入,直到判断完所有物品
  • 代码

    #include <iostream>
    
    using namespace std;
    
    void deal(double *value,double *weight,int n);
    void sort(double *value,int n);
    
    int main()
    {
        char name[7] = {'A','B','C','D','E','F','G'};
        double W;
        cin>>W;
        int n;
        cin>>n;
        double value[n],weight[n];
        for(int i = 0;i<n ;i++)
            cin>>value[i]>>weight[i];
        deal(value,weight,n);
        sort(value,n);
        int j = 0;
        while(j<n)
        {
            if(W >= weight[j])
            W -= weight[j];
            cout<<name[j]<<" "<<weight[j]<<endl;
            j++;
        }
        return 0;
    }
    
    void deal(double *value,double *weight,int n)
    {
        for(int i = 0;i<n;i++)
            value[i] /= weight[i];
    }
    
    void sort(double *value,int n)
    {
        for(int i = 0;i<n-1;i++)
        {
            for(int j = 0;j<n-i-1;j++)
            {
                if(value[j]<value[j+1])
                    swap(value[j],value[j+1]);
            }
        }
    }
  • 结果
    • 数据
      150
      7
      35 10
      30 40
      60 30
      50 50
      40 35
      10 40
      25 30

猜你喜欢

转载自www.cnblogs.com/NikkiNikita/p/9458496.html