题目链接http://acm.hdu.edu.cn/showproblem.php?pid=1009
这道题主要用到的是贪心算法,百度百科对这个算法的解释如下http://baike.baidu.com/view/298415.htm
很庆幸这道题没有像百科对贪心算法使用解释的那样复杂,相似于背包问题,这道题仅仅用每次取单位质量价值最大物品的方法来解就可以了。
我的代码如下(用G++编译通过):
#include<stdio.h>
#include<stdlib.h>
#define maxsize 10000
struct trade{
int J;
int F;
double value;
} tradeObj[maxsize];
int cmp(const void *a,const void *b){
struct trade *aa=(trade *)a;
struct trade *bb=(trade *)b;
return ((aa->value<bb->value)?1:-1);
}
int main(){
int M,N,i;
double totalMount;
while(scanf("%d %d",&M,&N)!=EOF){
totalMount=0.000;
if(M==-1&&N==-1)
break;
for(i=0;i<N;i++){
scanf("%d %d",&tradeObj[i].J,&tradeObj[i].F);
tradeObj[i].value=((double)tradeObj[i].J)/((double)tradeObj[i].F);
}
if(N==0){
printf("%.3f\n",totalMount);
continue;
}
if(M==0){
for(i=0;i<N;i++){
if(tradeObj[i].F==0){
totalMount+=(double)tradeObj[i].J;
}
}
printf("%.3f\n",totalMount);
continue;
}
qsort(tradeObj,N,sizeof(tradeObj[0]),cmp);
//for(i=0;i<N;i++)
// printf("%d %d %f\n",tradeObj[i].J,tradeObj[i].F,tradeObj[i].value);
i=0;
while(M){
if(M>=tradeObj[i].F){
totalMount+=(double)tradeObj[i].J;
//totalMount+=tradeObj[i].J;
M-=tradeObj[i].F;
}
else{
totalMount+=((double)M)/((double)tradeObj[i].F)*((double)tradeObj[i].J);
//totalMount+=M/tradeObj[i].F*tradeObj[i].J;
break;
}
i++;
}
printf("%.3f\n",totalMount);
}
return 0;
}
题目给的例子其实不足以成为验证能否AC的条件,综合网友的意见,还必须至少满足下面几个例子
0 4
1 0
9 1
3 0
10 0
14.000
1 0
0.000
5 4
10000 5
2000 2
100 0
300 0
10400.000
另外数据类型用double,应该是考虑到会有大数出现吧。