P2240 【深基12.例1】部分背包问题 贪心
P2240 【深基12.例1】部分背包问题
按价值比从大到小排序,每次选择价值比大的全部物品,或按比例选取部分物品直到背包为空为止。
#include<bits/stdc++.h>
using namespace std;
struct node{
int zl;
int jz;
bool operator<(const node &n) const{
return float(jz)/zl>float(n.jz)/n.zl;
}
};
vector <node> wp;
int main()
{
int n,t;
cin>>n>>t;
float ans=0;
for (int i=1;i<=n;i++)
{
node m;
cin>>m.zl>>m.jz;
wp.push_back(m);
}
sort(wp.begin(),wp.end());
for (int i=0;i<n;i++)
{
if (t>=wp[i].zl)
{
ans+=wp[i].jz;
t=t-wp[i].zl;
}
else{
ans+=(float)wp[i].jz/wp[i].zl*t;
t=0;
}
}
printf("%0.2lf",ans);
return 0;
}
浙公网安备 33010602011771号