Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >POJ 2797 金银岛(背包问题)

POJ 2797 金银岛(背包问题)

作者头像
天道Vax的时间宝藏
发布于 2021-08-11 02:39:26
发布于 2021-08-11 02:39:26
42700
代码可运行
举报
运行总次数:0
代码可运行

题目:金银岛

题意:

某天KID利用飞行器飞到了一个金银岛上,上面有许多珍贵的金属,KID虽然更喜欢各种宝石的艺术品,可是也不拒绝这样珍贵的金属。但是他只带着一个口袋,口袋至多只能装重量为w的物品。岛上金属有s个种类, 每种金属重量不同,分别为n1, n2, ... , ns,同时每个种类的金属总的价值也不同,分别为v1,v2, ..., vs。KID想一次带走价值尽可能多的金属,问他最多能带走价值多少的金属。注意到金属是可以被任意分割的,并且金属的价值和其重量成正比。

输入数据

  • 第1行是测试数据的组数k,后面跟着k组输入。
  • 每组测试数据占3行,第1行是一个正整数w (1 <= w <= 10000),表示口袋承重上限。第2行是一个正整数s (1 <= s <=100),表示金属种类。第3行有2s个正整数,分别为n1, v1, n2, v2, ... , ns, vs分别为第一种,第二种,...,第s种金属的总重量和总价值(1 <= ni <= 10000, 1 <= vi <= 10000)。

输出要求

  • 输出为k行,每行输出对应一个输入。输出应精确到小数点后2位。

样例输入

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
2
50
4
10 100 50 30 7 34 87 100
10000
5
1 43 43 323 35 45 43 54 87 43

样例输出

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
171.93
508.00

题目理解:

需要定义一个金属块的结构体,结构体内存放金属块的重量,价值和单位重量的价值。输入数据后,调用sort排序对金属块按照其单位重量的价值进行从大到小排序,后按照排序后的金属块,利用for循环对背包当前所剩容量进行判断,若所剩容量大于等于当前金属快的质量,则将金属块全部放入背包;若小于,则将金属块切割后放入背包。当背包容量<=0的时候,则退出循环,则当前的背包所载金属块的价值最大。

注意:

  • 金属块质量和价值未必是整数,若定义int整形,可能会报错。
  • 金属块单位重量均值由价值v/质量w得到。
  • 注意保留小数位数为2。

代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<deque>
#include<fstream>
#include<iomanip>
#include<map>
#include<queue>
#include<string>
#include<set>
#include<stack>
#include<vector>
typedef long long ll;
using namespace std;
struct js{  //定义金属块
	double w;
	double v;
	double avg;
}jsk[107];

bool cmp(struct js a,struct js b)
{
	return (a.avg>b.avg);
}

int main()
{
	int k;
	cin>>k;
	for(int s=0;s<k;s++)
	{
		int N;
		int S;
		cin>>S>>N;
		
		for(int i=0;i<N;i++)
		{
			cin>>jsk[i].w;
			cin>>jsk[i].v;
			jsk[i].avg=(1.0)*jsk[i].v/jsk[i].w;//求金属块每单位质量的价值
		}
		
	/*	for(int i=1;i<=N;i++)
		{
			cout<<jsk[i].w<<jsk[i].v<<endl;
			
		}*/
		
		sort(jsk,jsk+N,cmp);//按照均重从大到小排序
		

		/*for(int i=0;i<N;i++)
		{
		    cout<<jsk[i].avg<<endl;
		}*/
		
		double mm=0;
		for(int i=0;i<N;i++)
		{
			if(S<=0) break;//背包容量小于等于0,则表示背包全部装满,退出循环。
			if(jsk[i].w>S) {//如果当前金属块质量大于背包所剩载重,则将金属块进行切割。
				mm+=S*jsk[i].avg;
				S=0;
				
			}
			else {//如果当前金属块质量小于或等于所剩载重,则将金属块全部放入背包。
				mm+=jsk[i].v;
				S-=jsk[i].w;
			}
		}
		
		printf("%.2f\n",mm);
	}
	return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/08/03 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
背包九讲——多重背包问题
多重背包问题是背包问题的一种扩展,与0/1背包问题和分数背包问题有些不同。在多重背包问题中,每种物品都有限定的数量,不再是仅有一个,而是有多个。问题的描述如下: 给定一个背包容量为C,有n种物品,每种物品有重量w[i]、价值v[i]和数量s[i]。目标是选择物品放入背包,使得它们的总重量不超过背包容量,并且总价值最大。 这个问题在一些应用中更为真实,例如购物时某种商品有多件可供选择。解决多重背包问题的方法通常是在0/1背包问题的基础上进行一些调整。
摆烂小白敲代码
2024/10/19
2010
背包九讲——多重背包问题
细谈多重背包问题
多重背包问题是背包问题的一种扩展,与0/1背包问题和分数背包问题有些不同。在多重背包问题中,每种物品都有限定的数量,不再是仅有一个,而是有多个。问题的描述如下: 给定一个背包容量为C,有n种物品,每种物品有重量w[i]、价值v[i]和数量s[i]。目标是选择物品放入背包,使得它们的总重量不超过背包容量,并且总价值最大。 这个问题在一些应用中更为真实,例如购物时某种商品有多件可供选择。解决多重背包问题的方法通常是在0/1背包问题的基础上进行一些调整。
摆烂小白敲代码
2024/09/23
1160
细谈多重背包问题
背包九讲
01背包九讲里面最简单的一种了,但是也是最重要的一种,其他的几种基本上都可以用01背包的解题思路来去解决,接下来结合例题来解决一下吧;
某些人
2020/04/09
5190
背包九讲——树形背包问题(有依赖的背包)
背包问题第七讲——树形背包问题(有依赖的背包) 背包问题是一类经典的组合优化问题,通常涉及在限定容量的背包中选择物品,以最大化某种价值或利益。问题的一般描述是:有一个背包,其容量为C;有一组物品,每个物品有重量w和价值v。目标是选择一些物品放入背包,使得它们的总重量不超过背包容量,同时总价值最大。 树形背包也叫有依赖的背包,每个节点代表一个物品,节点之间通过边连接,表示层次关系。问题的目标是在遍历这棵树的过程中,选择一些物品放入背包,使得背包中物品的总价值最大。
摆烂小白敲代码
2024/11/24
2400
背包九讲——树形背包问题(有依赖的背包)
[C语言]背包问题「建议收藏」
http://blog.csdn.net/liwenjia1981/article/details/5725579
全栈程序员站长
2022/09/14
3450
【算法】动态规划:背包问题
(1) 定义状态 dp[i][j] 表示在前 i 个物品中挑选,总体积不超过 j 的所有选法中,最大的价值。
_小羊_
2025/03/29
960
【算法】动态规划:背包问题
动态规划专题——背包模型
求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。 输出最大价值。
浪漫主义狗
2022/09/19
1.1K0
背包问题详解:01背包、完全背包、多重背包「建议收藏」
动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中, 可能会有很多可行解。没一个解都对应于一个值,我们希望找到具有最优值的解。胎动规划算法与分治法类似,其基本思想也是将待求解问题分解为若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适用于动态规划算法求解的问题,经分解得到的子问题往往不是互相独立的。若用分治法来解这类问题,则分解得到的子问题数目太多,有些子问题被重复计算很多次。如果我们能保存已解决子问题的答案,而在需要时再找出已求得的答案,这样就可以避免大量的重复计算,节省时间。我们可以用一个表来记录所有已解决的子问题的答案。不管该子问题以后是否被用到,只要它被计算过,就将其结果填入表中。这就是动态规划算法的基本思路。具体的动态规划算法多种多样,但它们具有相同的填表格式。
全栈程序员站长
2022/07/02
6660
动态规划 4、基础背包问题总结(从01开始)「建议收藏」
简述:n种物品,每种一个,选或不选随你,背包一定有容量,求不超过容量的情况下,价值最大。
全栈程序员站长
2022/09/06
9870
动态规划 4、基础背包问题总结(从01开始)「建议收藏」
DP:完全背包问题
动态规划(DP)是算法中的重要技术,背包问题则是其中的经典问题之一。本篇博客将介绍完全背包问题及其解决方案。
用户11305458
2024/10/09
1880
DP:完全背包问题
leetcode刷题(132)——完全背包问题思路理解
有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品都有无限个(也就是可以放入背包多次),求解将哪些物品装入背包里物品价值总和最大。
老马的编程之旅
2022/11/21
4211
【dp】背包问题
背包问题是⼀种组合优化的问题。问题可以描述为:给定⼀组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高。
YoungMLet
2024/03/01
1550
【dp】背包问题
算法修炼之筑基篇——筑基一层初期(解决01背包问题)
在C/C++中,可以使用动态规划来解决01背包问题。动态规划是一种常用的解决优化问题的算法思想,它通过将问题分解为子问题,并利用子问题的解来构建更大规模的问题的解。
命运之光
2024/03/20
1060
算法修炼之筑基篇——筑基一层初期(解决01背包问题)
不止一个背包的背包问题_分组背包问题
第一类物品只能用1次(01背包); 第二类物品可以用无限次(完全背包); 第三类物品最多只能用 si 次(多重背包); 每种体积是 vi,价值是 wi。
全栈程序员站长
2022/09/22
4830
动态规划-背包问题(01背包、完全背包、多重背包)
背包问题:有多个重量不同、价值不同的物品,以及一个容量有限的背包,选择一些物品装入背包,求最大总价值。 背包问题无法用贪心求最优解,是典型的动态规划问题。背包问题还可以分成3种:① 0-1背包、② 完全背包、③ 多重背包。
唔仄lo咚锵
2020/09/15
13.4K0
回溯法解01背包问题_01背包问题回溯法伪代码
n皇后问题的解空间树是一颗排列树,而01背包问题的解空间树应该是一颗子集树。再简述下该问题:有n件物品和一个容量为c的背包。第i件物品的价值是v[i],重量是w[i]。求解将哪些物品装入背包可使价值总和最大。所谓01背包,表示每一个物品看成一个整体,要么全部装入,要么都不装入。这里n=5, c=10, w={2, 2, 6, 5, 4}, v={6, 3, 5, 4, 6}。
全栈程序员站长
2022/09/27
5950
回溯法解01背包问题_01背包问题回溯法伪代码
你听过算法也是可以贪心的吗?
贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。 贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。 基本思路 1、建立数学模型来描述问题; 2、把求解的问题分成若干个子问题; 3、对每一子问题求解,得到子问题的局部最优解; 4、把子问题的解局部最优解合成原来解问题的一个解。 算法实现 1、从问题的某个初
用户1332428
2018/03/08
1.2K0
你听过算法也是可以贪心的吗?
初谈背包问题——01背包
01背包问题是背包问题的的第一讲,也是动态规划问题的经典问题。在学习背包问题时首要学习的时01背包问题,其剩余的八讲背包都是在01背包的变体,从它这里延伸出来的,所以在学习背包问题时,01背包问题是基础之基础,务必要学会01背包问题。下面我们将对其进行介绍。
摆烂小白敲代码
2024/09/23
2470
初谈背包问题——01背包
01背包问题(动态规划)
有n个重量和价值分别为wi,vi的物品。从这些物品中挑选出总重量不超过W的物品,求所有挑选方案中价值总和的最大值。
砖业洋__
2023/05/06
1460
畅谈分组背包问题
分组背包问题是背包问题的一种变体,它在一组物品中进行选择,每个物品属于某个特定的组。问题的描述通常是这样的:给定若干组物品,每组物品都有自己的重量、价值以及数量限制。目标是选择若干组物品放入背包中,使得背包中物品的总价值最大。
摆烂小白敲代码
2024/09/23
710
畅谈分组背包问题
相关推荐
背包九讲——多重背包问题
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验