#include<bits/stdc++.h>
using namespace std;
int f(double x[],double y[],int n)
{
int c1=0,c2=0;
for(int e=n;e>1;e--)
if(x[e-1]/y[e-1]<x[e]/y[e])
{
c1=x[e-1];c2=y[e-1];
x[e-1]=x[e];y[e-1]=y[e];
x[e]=c1;y[e]=c2;
}
return n;
}
int main(){
int N=0,T=0,n=0;
cin>>N>>T;
double ans=0,weight=0;
double m[N+1],v[N+1];
cin>>m[0]>>v[0];
int I=0;
while(I!=N-1)
{
n=f(v,m,I);
I++;
//if(I==num+1)break;
//cout<<"enter:"<<endl;
cin>>m[I]>>v[I];
}
int i=0;
while(weight!=T){
if(weight+m[i]<=T){
weight+=m[i];
ans+=v[i];
}else{
ans+=((T-weight)/m[i])*v[i];
weight=T;
break;
}
//cout<<"ans:"<<ans<<" "<<"weight"<<weight<<endl;
i++;
}
printf("%.2f",ans);
return 0;
}
这是我的程序, 题号是 P2240 ,想法很简单,先按照单位金币价值进行排序,然后依次装包,然后一直装到刚好有一堆能装完后背包满了或者装不完所以切一部分下来装满背包位置 但是我不知道是哪儿出错了······望大佬指正