• 部分完全背包


    Description:

    部分背包问题是这样一个问题:
     
    给定n种物品和一个背包。物品i的重量是Wi,其价值为Vi,背包的容量为C。应如何选择装入背包的物品,
     
    使得装入背包中物品的总价值最大?
     
    选择物品i装入背包时,可以选择物品i的一部分,而不一定要全部装入背包,1≤i≤n。
     
    例如:背包容量为5,有3个物品
    第一个物品重量是2 价值是3
    第二个物品重量是3 价值是4
    第三个物品重量是4 价值是8
     
    那么选择第三个物品整体和第一个物品的1/2,得到最大总价值9.500
     

    Input:

    多组数据,
    第一行为背包容量W(1<=w<=2000000)和物品数量N(1<N<=200)
    接下来N行每行两个整数分别代表第i个物品的重量wi(wi<=50000)和价值vi(vi<=1000)
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    
    struct Thing{
        double weight,price;//物品的总重量和单位价格
        bool operator<(const Thing &b) const{
            return price>b.price;
        }
    }th[205];
    
    int main(){
        int n;
        double w;
        while(~scanf("%lf%d",&w,&n)){
            for(int i=0;i<n;i++){
                double  value;
                scanf("%lf%lf",&th[i].weight,&value);
                th[i].price=value/th[i].weight;
            }
            sort(th,th+n);
    
            double ans=0;
            int cur=0;//表示现在在考虑第几件物品
            while(w>0&&cur!=n){
                double t=min(w,th[cur].weight);
                //现在背包的大小,第cur件物品剩下的重量
                ans+=t*th[cur++].price;//增加这么多价值,cur到下一件物品
                w-=t;//背包又少了这么多体积
            }
            printf("%.3lf
    ",ans);
        }
        return 0;
    }
  • 相关阅读:
    OpenCV图像处理之 Mat 介绍
    linux 更改网卡名称 eth0
    【git】git常用命令
    【JS】函数提升变量提升以及函数声明和函数表达式的区别
    【VUE】vue中遍历数组和对象
    加密盐的意义和用途
    sql server2005版本中,len函数计算了字符串末尾的空格
    ES之一:API使用及常用概念
    flink (一)
    ClassLoader详解 (JDK9以前)
  • 原文地址:https://www.cnblogs.com/csustwj/p/4263353.html
Copyright © 2020-2023  润新知