zoukankan      html  css  js  c++  java
  • 分数规划-poj3111

    题意:给定n个珠宝,每个珠宝有重量 w 和价值v ,要求你从中选出k个,使∑v/∑w 尽可能大,输出选出的珠宝的编号 数据范围: 1 ⩽ k ⩽ n ⩽ 10 , 1 ⩽ w , v ⩽ 10.

    这道题是分数规划的典型题,但是有个小问题:
    我的做法在每个珠宝的v/w都一样时,
    min和max相同,就会跳出循环,被卡掉。
    分数规划要注意到这个问题!!

    #pragma GCC optimize("O3") 
    #include <cstdio>
    #include <algorithm>
    using namespace std;
    
    const int maxn=100005;
    const double EXP=1e-6, INF=1000000000;
    int n, k, v[maxn], w[maxn];
    double maxx, minx;
    struct node{
        double value;
        int id;
    };
    node t[maxn];
    
    bool cmp(const node &x, const node &y){
        return x.value>y.value;
    }
    
    bool test(double num){
        for (int i=0; i<n; ++i){
            t[i].id=i;
            t[i].value=v[i]-w[i]*num;
        }
        sort(t, t+n, cmp);
        double tot=0;
        bool flag=true;
        for (int i=0; i<k; ++i){
            tot+=t[i].value;
            if (tot<0) flag=false;
        }
        return flag;
    }
    
    int main(){
        maxx=0, minx=INF;
        scanf("%d%d", &n, &k);
        for (int i=0; i<n; ++i){
            scanf("%d%d", &v[i], &w[i]);
            if ((double(v[i])/w[i])>maxx) maxx=double(v[i])/w[i];
            if ((double(v[i])/w[i])<minx) minx=double(v[i])/w[i];
        }
        double mid, l=minx, r=maxx+EXP;
        while ((r-l)>EXP){
            mid=(l+r)/2;
            if (test(mid)) l=mid;
            else r=mid;
        }
        for (int i=0; i<k; ++i){
            printf("%d ", t[i].id+1);
        }
        return 0;
    }
  • 相关阅读:
    java初学
    数据库命名及设计规范(转)
    转-ASP.NET页面之间传递值
    程序员个人职业规划
    如何学习别人的代码(转)
    可映射的CSV读取引擎
    iTween扩展
    Unity3d中NGUI加强版血条(Healthbar)的制作
    Unity3D中寻路Navmesh的简单介绍
    多人网络(Valve开发文档翻译[起源引擎])(一)
  • 原文地址:https://www.cnblogs.com/MyNameIsPc/p/7337559.html
Copyright © 2011-2022 走看看