洛谷P2240 【深基12.例1】部分背包问题(经典模板)
首先应该注意几个关键信息:装走尽多的金币、所有金币可以随意分割并且分割后金币的价值比不变;
我们可以抽象成一个买东西的场景,给你一定数目的钱,让你在这些钱内尽量在超市买更多的小零食,这就牵扯到了一个性价比的问题。
那如此,这个题目就好解决了,就用这个背包尽量装更多的金币,如果可以装的下,那就装好了,毕竟谁不喜欢钱呢;
那如果装不下呢(对于第i堆金币)?
这个就可以把金币分割了,在剩下的背包容量中装可以装满的金币,用它的装载量去乘金币的价值比,就是所获得的金币的量;
代码如下:
#include<bits/stdc++.h> using namespace std; struct node { int value; int weight; double cp;//cost performence性价比 }coin[110]; bool cmp(node x,node y) { return (x.cp>y.cp); } int main() { int n,t; cin>>n>>t; for(int i=0;i<n;i++) { scanf("%d %d",&coin[i].weight,&coin[i].value); coin[i].cp=(double)coin[i].value/coin[i].weight;//类型转换 } sort(coin,coin+n,cmp);//性价比降序排序 double sum=0; for(int i=0;i<n;i++) { if(t>=coin[i].weight) { sum+=coin[i].value; t-=coin[i].weight; } else { sum+=t*coin[i].cp; break;//不要忘记break } } printf("%.2f",sum); return 0; }
本文来自博客园,作者:江上舟摇,转载请注明原文链接:https://www.cnblogs.com/LQS-blog/p/15865612.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律