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