【洛谷千题详解】P2240 背包问题

65009dd6b35f4712b6f0f0c00452c259.jpg

思路点拨:

先通过排序,保证先拿价值最大的;

再通过判断,如果包还有空间,就全拿

                      空间不够,就尽可能多拿

参考代码:

#include<iostream>
#include<algorithm> //使用sort需用此头文件 
using namespace std;
//定义结构体node,包含w重量,v总价值 
struct node{
float w,v;
}a[110];
//自定义比较(从大到小) 
bool cmp(node a,node b)
{
	return a.v*b.w>a.w*b.v;//交叉相乘 
}
int main()
{
	int n,t;//n代表有n堆金币,t代表承重为t的包 
	float ans=0.0;//答案
	cin>>n>>t;
	for(int i=1;i<=n;i++)
		cin>>a[i].w>>a[i].v;//输入 
	 	sort(a+1,a+n+1,cmp);//排序 
	for(int i=1;i<=n;i++)//一次遍历 
	{
		//如果t大于等于重量说明背包还有总够的
		//空间,可以全部拿走,只需把答案加上这
		//堆的总价值即可
		if(t>=a[i].w)  
		{
		ans=ans+a[i].v;
		t=t-a[i].w;    
		}
		//反之,就是不能全部装下,装得越多越好 
		else{
			ans=ans+t*(a[i].v/a[i].w);//先算出每千克价值多少
		    break;	                  //再乘上t还可以装多少
        							  //千克即可 
			}
	}
	printf("%.2f",ans);//输出 
	return 0;
}

 我还是一名小学生,这是我第一次提交,希望大家支持😁

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱编程的小芒果

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值