01分数规划 易懂+例题讲解 (c++)

news2024/12/27 12:58:34

01分数规划 :01即取还是不取,分数即所求型式为\sum \frac{a}{b},规划就是选取最好的方案。

一般情况题目给出n个物品,再给出每个物品的价值以及物重,选取k个物品,问你在所有可能选取的方案中,最大的单位价值为多少(单位价值为选取的 k 个物品的总价值和总重量的比值)。

我们选择采用二分法,进行判断。我们要求的是选取的 k 个物品的总价值和总重量的比值最大,最终求得是\sum \frac{a}{b}

所以我们在\sum \frac{a}{b}可取的区间内每次取区间中值mid,判断是否符合,符合则可以取右边区间,不符合则取左区间。

 eg:
 int l = 0, r = 1e8 + 5;
 while (l <= r)
      {
          int mid = (l + r) / 2;
          if (judge(mid)) l = mid + 1;
          else r = mid - 1;
       }

接下来是要写判断函数judge

我们知道我们所取的mid要符合 \sum \frac{a}{b}>=mid,则\sum(a-b*mid)>=0。所以我们要从大到小取

a-b*mid来相加直到k个才能保证最有可能大于等于0.

eg:
bool comp(node a,node b)//从大到小排序
{
	return a.tmp > b.tmp;
}
int  judge(double x)
{
	for (int i = 1; i <= n; i++)
    {
        a[i].tmp = a[i].v*1.0 - x * a[i].w*1.0;储存每个物品的价值-x*重量值
    }
	sort(a + 1, a + 1 + n, comp);//进行排序
	double sum = 0;
	for (int i = 1; i <= k; i++)//求和
	{
		sum += a[i].tmp;
	}
    
	return sum >= 0.0;//返回是否大于等于0
}

 

例题1: 

题目描述

wyh学长现在手里有 nnn 个物品,这 nnn 个物品的重量和价值都告诉你,然后现在让你从中选取 kkk 个,问你在所有可能选取的方案中,最大的单位价值为多少(单位价值为选取的 kkk 个物品的总价值和总重量的比值)

输入描述:

输入第一行一个整数 T(1≤T≤10)
接下来有 T 组测试数据,对于每组测试数据,第一行输入两个数 n 和 k(1≤k≤n≤100000)k
接下来有 n 行,每行两个是 a 和 b (0<a,b≤1000000)代表这个物品的重量和价值

输出描述:

对于每组测试数据,输出对应答案,结果保留两位小数

示例1

输入

1
3 2
2 2
5 3
2 1

输出

0.75

说明

对于样例来说,我们选择第一个物品和第三个物品,达到最优目的
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
struct node
{
	double w, v,tmp;
}a[100010];
int n, k;
bool comp(node a,node b)//从大到小排序
{
	return a.tmp > b.tmp;
}
int  judge(double x)
{
	for (int i = 1; i <= n; i++)
    {
        a[i].tmp = a[i].v*1.0 - x * a[i].w*1.0;//存储价值-x*重量
    }
	sort(a + 1, a + 1 + n, comp);//排序
	double sum = 0;
	for (int i = 1; i <= k; i++)//求和
	{
		sum += a[i].tmp;
	}
    
	return sum >= 0.0;返回是否大于等于0

}
int main()
{
	int t;
	cin >> t;
	while (t--)
	{
		cin >> n >> k;
		for (int i = 1; i <= n; i++)
		{
			cin >> a[i].w >> a[i].v;
		}
		double l = 1.0, r = 1e7 + 10;
		double ans;
		for(int i=1;i<=100;i++)
		{
			double mid = (l + r) / 2;
			if (judge(mid)) l = mid+1;
			else r = mid-1;
			
		}
		printf("%.2lf\n", l-1);

	}
}

 例题2:

题目描述

小咪是一个土豪手办狂魔,这次他去了一家店,发现了好多好多(n个)手办,但他是一个很怪的人,每次只想买k个手办,而且他要让他花的每一分钱都物超所值,即:买下来的东西的总价值/总花费=max。请你来看看,他会买哪些东西吧。

输入描述:

多组数据。

第一行一个整数T,为数据组数。

接下来有T组数据。

对于每组数据,第一行两个正整数n,k,如题。

接下来n行,每行有两个正整数ci,vi。分别为手办的花费和它对于小咪的价值。

输出描述:

对于每组数据,输出一个数,即能得到的总价值/总花费的最大值。精确至整数。

示例1

输入

1
5 1
1 2
2 3
3 4
4 5
5 6

输出

2

备注:

1≤T≤10

1≤n≤104

1≤k≤n

1≤ci,vi≤104

#include<iostream>
#include<algorithm>
using namespace std;
int t;
int n, k;
struct node 
{
    int c;
    int v;
    long long sum;
}a[10005];
bool cmp(node a, node b)
{
    return a.sum > b.sum;
}
int judge(long long x)
{
    for (int i = 1; i <= n; i++)
    {
        a[i].sum = a[i].v - x * a[i].c;
    }
    sort(a + 1, a + 1 + n, cmp);
    long long num = 0;
    for (int i = 1; i <= k; i++) 
    {
        num += a[i].sum;
    }
    if (num >= 0) return 1;
    else return 0;
}
int main()
{
    cin >> t;
    while (t--)
    {
        cin >> n >> k;
        for (int i = 1; i <= n; i++) 
        
        {
            cin>>a[i].c>>a[i].v;
        }
        int l = 0;
        int r = 1e8 + 5;
        while (l <= r)
        {
            int mid = (l + r) / 2;
            if (judge(mid)) l = mid + 1;
            else r = mid - 1;
        }
        cout << l-1 << endl;
    }
    return 0;
}

很明显懂了以后,遇到这种题目就可以选择直接套用模板。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/650522.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

通过零代码ETLCloud实现马帮ERP数据自动化同步

马帮ERP介绍 马帮ERP是一款云端跨境电商管理软件。与传统的ERP系统不同&#xff0c;马帮ERP专注于跨境电商领域&#xff0c;为电商企业提供一站式管理解决方案&#xff0c;包括财务管理、采购管理、进销存管理、订单管理等功能模块。该平台针对跨境电商行业特点&#xff0c;提…

MM32F3273G8P火龙果开发板MindSDK开发教程20 - freertos + letter shell 的移植

MM32F3273G8P火龙果开发板MindSDK开发教程20 - freertos letter shell 的移植 1、freertos下载 官网传送门 2、freertos移植 1、在工程目录device下新建freertos目录&#xff0c;将下载的源码source目录下的七个.c文件copy到新建的freertos目录。 2、将source/protable/G…

Word 2021入门指南:详细解读常用功能

软件安装&#xff1a;办公神器office2021安装教程&#xff0c;让你快速上手_正经人_____的博客-CSDN博客 一、 新建文档 打开Word 2021后&#xff0c;可以看到左上角的“文件”选项&#xff0c;点击它&#xff0c;在弹出的菜单中选择“新建”选项。然后可以选择空白文档或者使…

vue3+ts+vite+element plus中使用luckysheet(预览效果)

前言&#xff1a; 这两天一个项目&#xff0c;需要在页面中以excel的形式展示大量数据&#xff0c;喜欢偷懒的我果断扒拉了一堆适用于vue3的插件&#xff0c;下面简单说说我使用的luckysheet 使用&#xff1a; 一、准备一个vue3tsviteelement plus的项目 此处省略n个字。。。…

如何用 WampServer+快解析 搭建php文件管理器

基于网络&#xff0c;资源是大家最最基本的需求&#xff0c;许多网络爱好者不求利益&#xff0c;把自己收集的一些通过一些平台共享给大家&#xff0c;这就是资源共享。 资源共享程度越高&#xff0c;代表信息发展水平越高。现实工作中&#xff0c;由于用户提供的数据可能来自…

Linux基础IO - 软硬链接 | 动静态库

之前的文章中我们讲述了软硬链接中有关软连接的知识&#xff0c;本文中将继续讲述硬链接部分的知识&#xff0c;并且讲述一下动静态库的相关内容。 硬链接 硬链接本质上就是在当前目录建立一个新的文件名与指定文件inode的关系。 每当我们在当前目录下建立一个硬链接就会让文…

C++11多线程之条件变量

文章目录 一、关于多线程的同步二、初始条件变量三、关于条件变量的例题四、生产者消费者模型 一、关于多线程的同步 //函数被调用&#xff0c;分配相应的栈帧&#xff0c;进行现场保护void func(char c) {char filename[20] {};sprintf(filename, "test%c.txt",c)…

Fiddler Response私人订制

在客户端接口的测试中&#xff0c;我们经常会需要模拟各种返回状态或者特定的返回值&#xff0c;常见的是用Fiddler模拟各种请求返回值场景&#xff0c;如重定向AutoResponder、请求拦截修改再下发等等。小编在近期的测试中遇到的一些特殊的请求返回模拟的测试场景&#xff0c;…

《变形金刚7》票房大跳水!特效敷衍?剧情单薄?汽车人的未来在哪里?

《变形金刚&#xff1a;超能勇士崛起》 6.11&#xff08;上映第3天&#xff09; 单日票房8200万 6.12&#xff08;上映第4天&#xff09; 单日票房2173万 6.13&#xff08;上映第5天&#xff09; 单日票房1700万 说实在的&#xff0c;真没想到《变形金刚7》日票房会如此大幅…

高压放大器在铁电材料中的应用研究

铁电材料是一种具有特殊磁电性能的材料&#xff0c;包括压电陶瓷、磷酸铁钠陶瓷、氧化锌压电陶瓷等。这些材料在电力、电子、机械等领域有广泛的应用&#xff0c;如超声波发生器、声纳、压力传感等。其中&#xff0c;高压放大器在铁电材料中有着重要的应用。 一、高压放大器的基…

完美搭建一个vue3+ts项目(一篇文章搞定你的所有疑惑)

目录 一、创建vite项目 二、启动vite项目 三、处理一些配置问题 四、增加工程化插件 1、安装sass 2、安装vue-router 3、安装pinia 4、安装element-plus 5、安装axios 6、设置路径别名&#xff0c;将相对路径改为绝对路径 一、创建vite项目 1、在一个文件夹下通…

Vision Pro:为什么空间音频是AR的绝杀武器?

Apple Vision Pro&#xff0c;不仅仅是苹果全新的重磅品类&#xff0c;而且在它身上也融合了苹果过去几乎所有新技术&#xff0c;比如空间音频就是其中一个例子。 苹果表示&#xff0c;Vision Pro中空间音频可以很好的应用在&#xff1a;影视节目、游戏内容、3D空间照片、3D空…

金融风控项目实战-银行信用卡流失预测模型_基于ANN神经网络_金融培训_论文科研_毕业设计

业务背景 根据央行公布的数据显示&#xff0c;全国性银行信用卡和借贷合一卡的发卡量增速从2017年同比增速26.35%的高点逐年下降&#xff0c;截至2020年同比增速降至4.26%。银行信用卡发卡增速明显放缓的背景下&#xff0c;预防老客户流失的问题变得愈发重要。 假设一家消费信…

pytest+allure

知识点1&#xff1a; 1、测试结果信息阅读 passed表示通过&#xff0c;有个简写. failed表示失败&#xff0c;有个简写F 2、命令行参数 -h&#xff1a;帮助 -version&#xff1a;版本信息 3、测试用例命名规则&#xff1a; 测试函数必须以test开头 测试类必须以Test开头…

我为开放原子全球开源峰会助力:共建开源之梦

我为开放原子全球开源峰会助力&#xff1a;共建开源之梦 6月11日&#xff0c;以“开源赋能&#xff0c;普惠未来”为主题的2023开放原子全球开源峰会开幕式暨高峰论坛在北京成功举办。 开源的力量与魅力 开源是当今软件行业中不可忽视的力量&#xff0c;它为技术的快速发展和…

入职滴滴和字节的2 年里,我感觉忒真实了……

引言 先简单交代一下背景吧&#xff0c;某不知名985的本硕&#xff0c;17年毕业加入滴滴&#xff0c;之后跳槽到了头条&#xff0c;一直从事软件测试相关的工作。之前没有实习经历&#xff0c;算是两年半的工作经验吧。 这两年半之间完成了一次晋升&#xff0c;换了一家公司&…

Ubuntu如何安装vmtools?

虚拟机-安装VMware Tools 然后在Ubuntu中找到设备中的VMware Tools&#xff0c;将这个文件来复制到桌面上去。 选择提取到此处 可以看到桌面上多了一个VMware Tools的文件夹 使用cd命令进入桌面上的这个VMware tools的文件夹 使用sudo ./安装命令 对vmware-tools-distrib文件夹…

政企市场,「观望」AI大模型

数据安全等“刚需”下&#xff0c;私有化成为政企市场的准入门槛&#xff0c;然而私有化下&#xff0c;行业模型局限性尚未可知&#xff0c;加之信创化等因素&#xff0c;厂商仍需取长补短&#xff0c;为政企客户提供全方位的解决方案。 作者|斗斗 编辑|皮爷 出品|产业家 政…

采用UWB定位技术开发的室内定位系统源码

UWB精准定位系统源码 UWB是什么&#xff1f; UWB(Ultra Wideband)超宽带技术是一种全新的、与传统通信技术有极大差异的通信新技术。它不需要使用传统通信体制中的载波&#xff0c;而是通过发送和接收具有纳秒或纳秒级以下的极窄脉冲来传输数据&#xff0c;实现精准定位。 技术…

一名高水平的程序员,为什么面试总是失败?

目录 场景1 场景2 场景3 1 从发现和分析问题方面准备。 2 从linux命令和日志层面分析问题的步骤。 1 事先准备很重要 2 面试开始是自我介绍&#xff0c;这时要表露出&#xff0c;自己解决过redis,dubbo等组件的线上问题 3 一旦开始说第一个组件层面解决过的问题时&…