题源:P2240 【深基12.例1】部分背包问题 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
#include<bits/stdc++.h>
using namespace std;
int N,T,t=0,s2,b=0;
double jz[1000],s,mon=0,m[1000],v[1000];
void st(){
for(int i=1;i<=N;i++)
for(int j=i;j<=N;j++){
if(jz[i]<jz[j]){
swap(jz[i],jz[j]);
swap(m[i],m[j]);
swap(v[i],v[j]);
}
}
}
int main()
{
cin >> N >> T;
for(int i=1;i<=N;i++) {
cin >> m[i] >> v[i];
jz[i]=v[i]/m[i]; //求单位价值
}
st(); //按照单位价值排序
for(int i=1;i<=N;i++){
if(t+m[i]<T) {mon+=v[i]; t+=m[i]; b=1;} //不超出容量全装入
if(t+m[i]>=T && b!=1){mon=mon+jz[i]*(T-t); break;}//超出容量按照比例装入
b=0;
}
cout<<setiosflags(ios::fixed)<<setprecision(2)<<mon<<endl;
return 0;
}