鱼C论坛

 找回密码
 立即注册
查看: 2238|回复: 6

[已解决]【C++板块提升计划】梦想护卫舰 第8关 鱼C旅行团【答题有奖】 【原创】

[复制链接]
发表于 2023-1-10 09:09:23 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 zhangjinxuan 于 2023-1-16 11:05 编辑


上一关: 逃离荒岛

梦想护卫舰 第8关 鱼C旅行团 正常题型


修好零件出发没多久,小甲鱼 和 不二如是 坐着私人游艇赶了过来……

不二如是 见到我们之后,兴奋的说道:

”啊,勇敢的鱼油们,为了感谢你们救了我,我决定……“
”带你们去旅游!“


你们听到这个消息后,非常兴奋

可是小甲鱼说:

不过现在有一些问题,我们旅游不知道每个东西该带几个,因为我们的船是有限的,每个船的容积也可能不一样,而且这些东西,也各有各自的重量和价值……


题目

现在一共有 n 艘船可以用来装旅游所要带的物品,第 i 艘船的装载极限是 ai,另外,还有 m 个物品,其中,第 i 个物品重量是 vi,实际的价值是 wi,不过好在,每个物品都有无穷

请问,在每艘船不超重的情况下,能获得的最大价值是多少?

注意:当然不能用两艘船装一件物品

你能解决这个问题吗?

输入格式
第一行两个数字,分别表示 n, m
第二行 n 个数字,第 i 个数字也就是 ai
接下来 m 行,每行两个数字,第 i 行内容分别是 vi, wi
  1. n m
  2. a1 a2 ... a n
  3. v1 w1
  4. v2 w2
  5. ...
  6. vm wm
复制代码


输出格式
一个数字,表示能获得的最大价值

输入样例
  1. 1 5
  2. 10
  3. 5 3
  4. 3 6
  5. 7 8
  6. 5 9
  7. 2 4
复制代码

输出样例
  1. 20
复制代码


数据范围
所有数据 <= 200

其他说明
题目、题解为个人原创,时间限制 1s,空间限制 256mb



                               
登录/注册后可看大图


答案与解析
游客,如果您要查看本帖隐藏内容请回复
[/hide]
下一篇:https://fishc.com.cn/forum.php?mod=viewthread&tid=223520
最佳战士排行榜
第一名第二名第三名
名字ExiaGN001等待着勇敢细心聪明的鱼油~
链接戳我
代码得分100
综合评分100
奖励鱼币荣誉共8个+最佳答案鱼币荣誉共8个鱼币荣誉共4个


如果你喜欢,别忘了评分
最佳答案
2023-1-11 13:01:19
我的答案,请帮忙评测一下:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define v(i) v[i].first
  4. #define w(i) v[i].second
  5. bool cmp(pair<int,int> a,pair<int,int> b)
  6. {
  7.         double avea=((double)a.second/(double)a.first);
  8.         double aveb=((double)b.second/(double)b.first);
  9.         return  avea==aveb?(a.first<b.first):avea>aveb;
  10. }
  11. int main()
  12. {
  13.         int n,m;
  14.         cin>>n>>m;
  15.         int a[250];
  16.         pair<int,int> v[250];
  17.         for(int i=0;i<n;i++)cin>>a[i];
  18.         for(int i=0;i<m;i++)cin>>v(i)>>w(i);
  19.         sort(v,v+m,cmp);
  20.         //for(int i=0;i<m;i++)cout<<v(i)<<" "<<w(i)<<" "<<(double)w(i)/(double)v(i)<<"\n";
  21.         //开始装包!
  22.         int b[250];
  23.         int ans=0;
  24.         memset(b,0,sizeof(b));
  25.         for(int i=0;i<n;i++)
  26.         {
  27.                 for(int j=0;j<m;j++)
  28.                 {
  29.                         while(a[i]>=v(j))
  30.                         {
  31.                                 a[i]-=v(j);
  32.                                 b[i]+=w(j);
  33.                         }
  34.                 }
  35.                 ans+=b[i];
  36.         }
  37.         cout<<ans;
  38.         return 0;
  39. }
复制代码

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
ExiaGN001 + 1 + 1 鱼C有你更精彩^_^

查看全部评分

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-1-10 09:19:10 | 显示全部楼层
顶顶顶~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-10 09:55:23 | 显示全部楼层
顶·
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-1-11 10:14:47 | 显示全部楼层
哈哈哈哈哈
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-11 12:48:44 | 显示全部楼层
多重背包?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-1-11 12:52:54 | 显示全部楼层

多个完全背包……
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-11 13:01:19 | 显示全部楼层    本楼为最佳答案   
我的答案,请帮忙评测一下:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define v(i) v[i].first
  4. #define w(i) v[i].second
  5. bool cmp(pair<int,int> a,pair<int,int> b)
  6. {
  7.         double avea=((double)a.second/(double)a.first);
  8.         double aveb=((double)b.second/(double)b.first);
  9.         return  avea==aveb?(a.first<b.first):avea>aveb;
  10. }
  11. int main()
  12. {
  13.         int n,m;
  14.         cin>>n>>m;
  15.         int a[250];
  16.         pair<int,int> v[250];
  17.         for(int i=0;i<n;i++)cin>>a[i];
  18.         for(int i=0;i<m;i++)cin>>v(i)>>w(i);
  19.         sort(v,v+m,cmp);
  20.         //for(int i=0;i<m;i++)cout<<v(i)<<" "<<w(i)<<" "<<(double)w(i)/(double)v(i)<<"\n";
  21.         //开始装包!
  22.         int b[250];
  23.         int ans=0;
  24.         memset(b,0,sizeof(b));
  25.         for(int i=0;i<n;i++)
  26.         {
  27.                 for(int j=0;j<m;j++)
  28.                 {
  29.                         while(a[i]>=v(j))
  30.                         {
  31.                                 a[i]-=v(j);
  32.                                 b[i]+=w(j);
  33.                         }
  34.                 }
  35.                 ans+=b[i];
  36.         }
  37.         cout<<ans;
  38.         return 0;
  39. }
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zhangjinxuan + 5 + 5 鱼C有你更精彩^_^

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-22 20:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表