【洛谷P2240】部分背包问题

想装走价值尽可能多的金币,因为金币可以任意分割,所以可以用贪心算法来解决问题。
首先定义一个结构体:金币{总总量,总价值,单位价值};
然后对每堆金币的单位价值排序,依次放入背包;
判断是否能将金币全部装入,如果可以则所有金币总价值相加,否则加上剩余重量×单价,输出最终总价值。

#include<bits/stdc++.h>

using namespace std;

struct jb{

	int zl;//总重量 

	int jz;//总价值 

	double dj;//金币单价 

};

jb a[101]; 

bool cmp(jb a,jb b){

	return a.dj>b.dj;

}

int main()

{

	int i,n,t,s1=0;//s1为当前背包重量 

	double s2=0;//s2为当前背包价值 

	cin>>n>>t;

	for(i=1;i<=n;i++){

		cin>>a[i].zl>>a[i].jz;

		a[i].dj=double(a[i].jz)/a[i].zl;

	}

	sort(a+1,a+1+n,cmp);

    for(i=1;i<=n;i++){

    	if(s1+a[i].zl<=t){

    		s1+=a[i].zl;

    		s2+=a[i].jz	;	

		}

		else{

			s2+=(t-s1)*a[i].dj;

			break;

		}

	}

	cout<<fixed<<setprecision(2)<<s2<<endl;

	return 0;

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值