部分背包问题
题目描述
阿里巴巴走进了装满宝藏的藏宝洞。藏宝洞里面有 N(N≤100)N(N≤100) 堆金币,第 ii 堆金币的总重量和总价值分别是 mi,vi(1≤mi,vi≤100)mi,vi(1≤mi,vi≤100)。阿里巴巴有一个承重量为 T(T≤1000)T(T≤1000) 的背包,但并不一定有办法将全部的金币都装进去。他想装走尽可能多价值的金币。所有金币都可以随意分割,分割完的金币重量价值比(也就是单位价格)不变。请问阿里巴巴最多可以拿走多少价值的金币?
输入描述
第一行两个整数 N,TN,T。
接下来 NN 行,每行两个整数 mi,vimi,vi。
输出描述
一个实数表示答案,输出两位小数。
样例输入
Copy to Clipboard
4 50
10 60
20 100
30 120
15 45
样例输出
Copy to Clipboard
240.00
思路:
优先放平均价值最高的。首先按平均价值排序,然后装。装得下一份则全装,容量减少物品容量,价值增加物品全部价值;装不下一份则价值增加
剩余容量*平均价值,此时装满,break。
代码:
#include<iostream> #include<vector> /* 1.本题较为简单 2.注意点:平均价值需要double,除法时除数或被除数强制类型转换 */ using namespace std; int main(){ int n,v; while(cin>>n>>v){ struct{ int weight; int price; double pervalue; }goods[n],temp; for(int i=0;i<n;++i){ cin>>goods[i].weight>>goods[i].price; goods[i].pervalue=(double)goods[i].price/(double)goods[i].weight; } for (int i=0; i<n-1; ++i) //比较n-1轮 { for (int j=0; j<n-1-i; ++j) //每轮比较n-1-i次, { if (goods[j].pervalue < goods[j+1].pervalue) { temp = goods[j]; goods[j] = goods[j+1]; goods[j+1] = temp; } } }//按照pervalue冒泡 double sumprice = 0; for(int i = 0;i<n;i++){ if(v>=goods[i].weight){ sumprice+=goods[i].price; v-=goods[i].weight; } else{ sumprice+=(double)v*goods[i].pervalue; break; } } printf("%.2f\n",sumprice); }//while return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律