栏目分类:
子分类:
返回
文库吧用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
文库吧 > IT > 软件开发 > 后端开发 > C/C++/C#

部分背包(洛谷p2240)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

部分背包(洛谷p2240)

题目:【深基12.例1】部分背包问题 - 洛谷 题意:任意堆金币,把背包装满,求最大价值。 难度:★★★ 类型:贪心 分析:此题挺简单的(Dev C++:那你还编译了n多遍),可以利用贪心思想, 先求出每堆的性价比,才用sort排序,外加结构体辅助,int每堆的重量与总价。
#include
using namespace std;
double a[105], t, m[105], v[105], ans;
int n; 
int main()
{
	cin>>n>>t;
	for(int i=1;i<=n;i++)
	{
		cin>>m[i]>>v[i];
		a[i]=v[i]/m[i];
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j 

抄了这个代码,会有一个大问题(是不是感觉我在骗你)。首先要明白,在C++中,如果用除法,会丢失一些精度,虽说没太大影响,但小数部分会有变动,以至于我们要用乘法代替除法。

给大家举个结构体例子(这啥玩意儿☹)

X.V/X.M>Y.V/Y.M

我们让两边的分母各乘一个X.M*Y.M,这样式子就变成了

X.V*Y.M>Y.V*X.M

这就完美解决了除法精度有误的问题。

题解是我家,AC靠大家 二话不说来贴代码。

#include
using namespace std;
double ans;
int n,t;
struct coin
{
	int m, v;
}a[105];
bool cmp(coin x, coin y)
{
	return x.v*y.m>y.v*x.m; 
}
int main()
{
	cin>>n>>t;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i].m>>a[i].v;
	}
	int c=t;
	sort(a+1,a+n+1,cmp);
	for(int i=1;i<=n;i++)
	{
		if(c>a[i].m)
		{
			c-=a[i].m;
			ans+=a[i].v;	
		}
		else
		{
			ans+=1.0*a[i].v/a[i].m*c;
			break;
		}
	}
	printf("%.2lfn",ans);
	return 0;
}

 这么认真地看了,不如点个赞吧!!!

转载请注明:文章转载自 www.wk8.com.cn
本文地址:https://www.wk8.com.cn/it/1037103.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 wk8.com.cn

ICP备案号:晋ICP备2021003244-6号