HDOJ1009 肥鼠的交易

来源:互联网 发布:银行招聘程序员工资 编辑:程序博客网 时间:2024/06/09 15:58
题目详见http://acm.hdu.edu.cn/showproblem.php?pid=1009这个问题很简单,类似多重背包问题,不过这个多重背包是可以拿一部分的,而不像之前说的背包问题。很明显是贪心算法,首先根据JavaBean价值大小排序,然后根据手里的猫食来换取最大价值的JavaBean。每次都要判断是否够换一个整的,够的话就换,然后手里的猫食减少,不够换一个整的,那就换一部分,这个时候手里就没有猫食了。。
上代码

#include <iostream>  #include<algorithm> #include<vector>#include<iomanip>using namespace std;  typedef struct JavaBean{double j;double f;double value;}JavaBean; bool MaxToMin(const JavaBean& a ,const JavaBean& b);double MaxJavaBean(const vector<JavaBean>& javabean,int m,int n);int main(){int m,n,i;JavaBean temp; vector<JavaBean> javabean;while(cin>>m>>n){if(-1==m&&-1==n)break;i=n;javabean.clear(); while(i--){cin>>temp.j;cin>>temp.f;temp.value=temp.j/temp.f;javabean.push_back(temp);}sort(javabean.begin(),javabean.end(),MaxToMin);cout<<fixed<<setprecision(3)<<MaxJavaBean(javabean,m,n)<<endl;}return 0;}bool MaxToMin(const JavaBean& a ,const JavaBean& b){if(a.value>=b.value)return true;elsereturn false;}double MaxJavaBean(const vector<JavaBean>& javabean,int m,int n){int i;double sum=0;;for(i=0;(i<n)&&(m>0);i++){if(m>=javabean[i].f){sum+=javabean[i].j;m-=javabean[i].f;}else{sum+=javabean[i].value*m;break;}}return sum;}
转载请注明出处http://blog.csdn.net/liangbopirates/article/details/10042497

原创粉丝点击