首页 > 其他分享 >背包问题 V3( $01$ 分数规划入门题)

背包问题 V3( $01$ 分数规划入门题)

时间:2023-06-16 09:23:38浏览次数:51  
标签:fp fq 01 入门 int text sum V3 include

附赠题目链接:\(\text{51Nod-1257}\)

目录

\(\text{description}\)

\(n\) 个物品的体积为 \(w_1,w_2,\cdots,w_n\)(\(w_i\) 为整数),与之相对应的价值为 \(p_1,p_2,\cdots,p_n\)(\(p_i\) 为整数),从中选出 \(k\) 件物品(\(k\le n\)),使得单位体积的价值最大。

\(\text{sol}\)

对于题目中的单位体积的价值可以理解为:

\[\max\left\{\frac{\sum_{i=1}^{k}p_i}{\sum_{i=1}^{k}w_i}\right\} \]

其中 \(p_i\) 的选取同时会影响到分子和分母的大小,从而影响最终答案,因此无法进行贪心选择。

通过 \(01\) 分数规划解决问题,将原本的问题进行转换。

首先令答案为 \(x\),那么有 \(x=\left(\sum_{i=1}^{k}p_i\right){/}\left(\sum_{i=1}^{k}w_i\right)\)。

将其修改得到其变式为

\[\sum_{i=1}^{k}p_i-x\sum_{i=1}^{k}w_i=0 \]

那么就是说这个答案 \(x\) 是一定存在一个方案使得上述式子为 \(0\)。

由此,假如一个 \(x'\) 使得上述公式的最大值大于 \(0\) 的话,就表示还有更优的答案 \(x\),相反同理。

那么就可以考虑二分答案,将每个物品的权值看作 \(p_i-x\times w_i\)。

这时候我们只需要选择 \(k\) 个数,判断其最大值是否大于 \(0\) 即可,此时可以选择贪心求解。

\(\text{CODE}\)

//
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const double eps=1e-5;
double l,r,d[100100],tmp;
int a[100100],b[100100],tmpk[100100];
int tmpp,tmpq,n,k,fq,fp,fk;
int gcd(int a,int b) {
    while(b^=a^=b^=a%=b);
    return a;
}
bool check(double x) {
    tmp=0.00; tmpp=tmpq=0;
    for(int i=1;i<=n;i++) {
        d[i]=1.00*a[i]-1.00*b[i]*x;
        tmpk[i]=i;
    }
    sort(tmpk+1,tmpk+1+n,[](int x,int y){
        return d[x]>d[y];
    });
    for(int i=1;i<=k;i++) {
        tmp+=d[tmpk[i]];
        tmpq+=a[tmpk[i]];
        tmpp+=b[tmpk[i]];
    }
    return tmp>=eps;
}
int main() {
    scanf("%d%d",&n,&k);
    for(int i=1;i<=n;i++) {
        scanf("%d%d",&b[i],&a[i]);
    }
    l=0.00; r=100000.00;
    while(r-l>eps) {
        double mid=(l+r)/2.00;
        if(check(mid)) {
            l=mid;
            fq=tmpq; fp=tmpp;
        }
        else r=mid;
    }
    fk=gcd(fq,fp);
    printf("%d/%d",fq/fk,fp/fk);
    return 0;
}

\(\text{Else}\)

在判断二分的答案是否合法的时候,有时候需要选择不只是贪心的其他方法,例如:动规等。

同样的是一道入门题:Dropping tests

涉及到树上问题的 \(01\) 规划:规划

标签:fp,fq,01,入门,int,text,sum,V3,include
From: https://www.cnblogs.com/Cnghit/p/17484727.html

相关文章

  • RocketMQ 从入门到实战
    扫一扫加入作者公众号扫一扫关注中间件兴趣圈RocketMQ官微扫一扫关注【阿里巴巴云原生】公众号阿里云开发者“藏经阁”获取第一手技术干货海量免费电子书下载作者简介作者简介丁威,《RocketMQ技术内幕》作者,RocketMQ官方社区优秀布道师,荣获CSDN2020博客之星亚军;担任......
  • VC2010工程依赖不再自动链接
    发现VC2010Express 设置了ProjectDependencies之后并没有自动链接.而在VC2008中工程依赖不仅影响构建顺序,也会自动链接依赖项.具体说明见:http://blogs.msdn.com/b/vcblog/archive/2010/02/16/project-settings-changes-with-vs2010.aspx现在应该使用References来设置依赖......
  • VC2010编译 thrift compiler
    VC2010编译thriftcompiler需flex,bison.bison依赖m4,regex.Pre-Buildevent中flex命令有误,-o与参数间不应该有空格。flex-o"src\\thriftl.cc"src/thriftl.llbison-y-o"src\thrifty.cc"--defines="src/thrifty.h"src/thrifty.yycompiler......
  • JS01
    如何写一段JS代码并运行写在行内<!--html--><inputtype="button"value="按钮"onclick="alert('HelloWorld');"/>写在script标签中<!--html--><head><script>alert('HelloWorld');......
  • Vue项目入门实战(07)-想让你的Vue页面更炫酷?来学习样式绑定吧
    1class的对象绑定1.1需求现在要实现点击div区域里的helloworld文本时,文本变成红色。1.2实现<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Vue中的样式绑定</title><scriptsrc="../vue.js&q......
  • rpcz VC2010 构建
    rpczVC2010构建rpcz是应用ZeroMQ和Protobuf开发的RPC.见:https://github.com/reinferio/rpcz及https://code.google.com/p/rpcz/rpcz的CMake脚本应该是仅用于Linux.用于VC需要更改错误。CMakeErroratD:/ProgramFiles/CMake2.8/share/cmake-2.8......
  • 学习爬虫入门2,count反爬虫思路
    浏览网页的过程1.输入网址2.浏览器向DNS服务商发起请求3.找到对应服务器4.服务器解析请求5.服务器处理最终请求发回去6.浏览器解析返回数据7.展示给用户爬虫策略广度优先  深度优先  聚焦爬虫BFS从根节点开始沿着树的宽度深度优先DFS尽可能深的搜索树的分支......
  • 「路飞项目01」
    1企业项目类型#1面向互联网用户:商城类项目-微信小程序商城-app商城-得物-饿了么-问卷网#2面向互联网用户:二手交易类的-咸鱼-转转#3公司内部项目:python写的重点-传统软件行业,给客户做软件:国家电网,社保局,银行,医院,大客户-互......
  • 【Netty】「萌新入门」(二)剖析 EventLoop
    前言本篇博文是《从0到1学习Netty》中入门系列的第二篇博文,主要内容是介绍Netty中EventLoop的使用,优化及源码解析,往期系列文章请访问博主的Netty专栏,博文中的所有代码全部收集在博主的GitHub仓库中;概述事件循环对象EventLoop在Netty中,EventLoop是用于处理I/O事件的......
  • Word 2016 不会响应WindowBeforeRightClick事件的Bug问题
    c#-WindowBeforeRightClickdoesn'twork-StackOverflow这是在Word2016的2016年3月更新中修复的错误。MS16-029:Word2016安全更新说明:2016年3月8日https://support.microsoft.com/en-us/kb/3114855......