简单的部分背包问题,相除排序然后取
#include<stdio.h>
#include<stdlib.h>
struct doors{
float java;
float fat;
double result;
}dor[1005];
int cmp(const void *a,const void *b){
return ((struct doors *)b)->result > ((struct doors *)a)->result ? 1 : -1;
}
int main(void){
int m, n, i, j;
double sum;
while( scanf("%d%d", &m, &n), m != -1 || n != -1){
for( i = 0; i < n; i++){
scanf("%f%f", &dor[i].java, &dor[i].fat);
dor[i].result = dor[i].java * 1.0 / dor[i].fat; //这里有一个问题,如果不乘1.0话就WA,可是明明是浮点数相除啊
}
qsort( dor,n,sizeof(struct doors),cmp);
sum = 0;
for( i = 0; i < n; i++){
if( m < dor[i].fat){
sum += dor[i].result * m;
break;
}
else{
sum += dor[i].java;
m -= dor[i].fat;
}
}
printf("%.3lf\n", sum);
}
return 0;
}
本文介绍了一个简单的部分背包问题解决方案,通过定义结构体存储物品价值和重量,并利用相除排序来优化选择过程。代码示例展示了如何实现这一算法,包括输入处理、结构体定义、比较函数设计以及最终结果的输出。

2121

被折叠的 条评论
为什么被折叠?



