Problem - 1009 (dingbacode.com)https://acm.dingbacode.com/showproblem.php?pid=1009
这个背包问题是,可分割的背包问题,采取的策略是,优先选择单位价值量大的物品,尽可能多的装入背包。
AC代码:
#include <cstdio>
#include <algorithm>
using namespace std;
#define MAXN 1010
typedef struct node {
double p;
int f;
int j;
bool operator<(const node &a) const {
return p > a.p;
}
} node;
node record[MAXN];
int main() {
int M, N;
while (scanf("%d %d", &M, &N)) {
if (M == -1 && N == -1) {
break;
}
for (int i = 0; i < N; ++i) {
scanf("%d %d", &record[i].j, &record[i].f);
record[i].p = 1.0 * record[i].j / record[i].f;
}
sort(record, record + N);
int i = 0;
double javabean = 0;
while (i < N && M > 0) {
if (M >= record[i].f) {
javabean += record[i].j;
M -= record[i].f;
} else {
javabean += (record[i].j * 1.0 * M / record[i].f);
M = 0;
}
i++;
}
printf("%.3lf\n", javabean);
}
return 0;
}