zoukankan      html  css  js  c++  java
  • 贪心算法训练(一)——部分背包问题

    • 问题描述

      • 有一个背包,背包容量是 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
  • 相关阅读:
    个人工作量
    个人作业
    本周psp
    典型用户和场景总结
    排球比赛计分规则功能说明书
    我与计算机
    个人作业
    《怎样成为一个高手》读后感
    第十八周个人作业
    第十六周 项目耗时记录
  • 原文地址:https://www.cnblogs.com/NikkiNikita/p/9458496.html
Copyright © 2011-2022 走看看