当前位置: 首页 > news >正文

背包问题 - I NEED A OFFER!

题目描述

Speakless 很早就想出国,现在他已经考完了所有需要的考试,准备了所有要准备的材料,于是,便需要去申请学校了。要申请国外的任何大学,你都要交纳一定的申请费用,这可是很惊人的。Speakless 没有多少钱,总共只攒了 \(n\) 万美元。他将在 \(m\) 个学校中选择若干的(当然要在他的经济承受范围内)。每个学校都有不同的申请费用 \(a\)(万美元),并且 Speakless 估计了他得到这个学校 offer 的可能性 \(b\)。不同学校之间是否得到 offer 不会互相影响。“I NEED A OFFER”,他大叫一声。帮帮这个可怜的人吧,帮助他计算一下,他可以收到至少一份 offer 的最大概率。(如果 Speakless 选择了多个学校,得到任意一个学校的 offer 都可以)。

输入

输入有若干组数据,每组数据的第一行有两个正整数 \(n, m\)\(0 \leq n \leq 10000, 0 \leq m \leq 10000\)
后面的 \(m\) 行,每行都有两个数据 \(a_i\)(整型),\(b_i\)(实型)分别表示第 \(i\) 个学校的申请费用和可能拿到 offer 的概率。
输入的最后有两个 \(0\)

输出

每组数据都对应一个输出,表示 Speakless 可能得到至少一份 offer 的最大概率。用百分数表示,精确到小数点后一位。

样例

Input

10 3
4 0.1
4 0.2
5 0.3
0 0

Output

44.0%

问题转化

至少得到一份 offer 的概率 = \(1 - P(\text{一个 offer 都没有})\)
\(p_i = b_i\) 为拿到 offer 的概率,则 \(q_i = 1 - p_i\) 为拿不到 offer 的概率。

如果选了若干学校 \(S\)

  • 一个 offer 都没有的概率 = \(\prod_{i \in S} q_i\)
  • 至少得到一个 offer 的概率 = \(1 - \prod_{i \in S} q_i\)

因此,原问题等价于

在总花费 ≤ \(n\) 的情况下,最小化 \(\prod_{i \in S} q_i\)

动态规划定义

\(f[v]\) = 花费不超过 \(v\) 万美元时,得不到任何 offer 的最小概率

初始:

  • \(f[0] = 1\)(不花钱、不申请 → 100% 得不到 offer)
  • 其余 \(f[v] = +\infty\)(初始时这些花费状态不可达,用大于 1 的数表示不可达)

状态转移

对于每个学校 \(i\)(花费 \(w_i\),失败概率 \(q_i = 1-p_i\)):

\[f[v] = \min(f[v], f[v - w_i] \times q_i) \quad (v \ge w_i) \]


最终答案

在所有 \(v\)\(0\)\(n\) 中:
至少得到一个 offer 的最大概率为:

\[\max_{0 \le v \le n} (1 - f[v]) \]

将结果乘以 100,保留 1 位小数,输出百分数。


样例验证

输入:

10 3
4 0.1
4 0.2
5 0.3
  • 学校 1:\(q_1 = 0.9\)\(w_1=4\)
  • 学校 2:\(q_2 = 0.8\)\(w_2=4\)
  • 学校 3:\(q_3 = 0.7\)\(w_3=5\)

可选方案:

  1. 学校 1+2:花费 8,失败概率 \(0.9×0.8=0.72\),成功概率 \(0.28\)
  2. 学校 2+3:花费 9,失败概率 \(0.8×0.7=0.56\),成功概率 \(0.44\)最优
  3. 学校 1+3:花费 9,失败概率 \(0.9×0.7=0.63\),成功概率 \(0.37\)
  4. 只选学校 3:花费 5,失败概率 \(0.7\),成功概率 \(0.3\)
  5. 只选学校 2:花费 4,失败概率 \(0.8\),成功概率 \(0.2\)
  6. 只选学校 1:花费 4,失败概率 \(0.9\),成功概率 \(0.1\)

最优是 \(0.44\),对应 \(44.0\%\)

#include <bits/stdc++.h>
#define LL long long
using namespace std;
double p[10002],f[10002];
int w[10002];int main() {for(;;) {int n,m;cin>>n>>m;if (n==0 && m==0) break;for (int i=1;i<=m;i++) scanf("%d%lf",&w[i],&p[i]);for (int i=0;i<=n;i++) f[i]=1;for (int i=1;i<=m;i++)for (int j=n;j>=w[i];j--)f[j]=min(f[j],f[j-w[i]]*(1-p[i]));printf("%.1lf",(1-f[n])*100);cout<<"%\n"<<endl;}return 0;
}
http://www.jsqmd.com/news/390321/

相关文章:

  • Python中的素材序列之元组
  • 年味还能这样打开?魔乐社区新年征文赛今日启动,等你来战
  • 大年初一 魔乐社区给你发算力红包啦!
  • 1美金/小时,更快更强更智能,为真实世界生产力而生!MiniMax M2.5开源并上线魔乐社区
  • GLM-5上线魔乐社区,基于昇腾的模型推理+训练部署教程请查收!
  • 叮~~Qwen3.5上线魔乐社区,基于昇腾的部署教程来了
  • Linux如何设置 /etc/init.d 类型的服务开机自启
  • Linux service 命令详解
  • 今天终于搞懂了:为什么 Java 的 main 方法必须是 public static void?
  • 闲话
  • 2026.2.17
  • 元控制框架下的推理资源动态分配与优化策略
  • 昭和物语
  • Kubernetes编程/Operator专题【左扬精讲】—— Operator 开发实战项目2 —— 实现阿里云定时弹性伸缩器
  • 树哈希
  • Java 工程师必知必会的 hashCode 和 hash 算法
  • 终结二维监控,开启电力空间智能时代——矩阵视频融合 × 三角测量 × 数字孪生驱动能源安全治理升级
  • 【图文讲解】TCP为啥要3次握手和4次挥手?握两次手不行吗?
  • 高辐射率涂层原理、工艺与选型指南
  • 利用FLAC3D软件求解不同应力释放系数下的围岩特征曲线
  • 《军储与重点仓储空间级轨迹建模与异常停留识别平台》——统一坐标输出轨迹证据链 × 长时停留风险评分
  • Doris在零售行业的应用:实时销售分析系统
  • 商用硅基涂料(如HiE-Coat、Pyromark)
  • nodejs+vue3智慧教育学习笔记系统
  • 小型公司持续集成工具 Jenkins 实践:从零搭建到高效运维
  • 协同过滤算法Nodejs+vue3的旅游景点推荐系统 商家
  • 无人机倾斜摄影内业全流程
  • VR华夏神舟——沉浸式遨游太空,解锁航天科普新体验 - 指南
  • 一个可用的SQLite方言类
  • 数据中台在大数据领域的用户体验设计