#include<stdio.h>
#include<stdlib.h>
struct Node
{
double value;
double weight;
}a[10];
void quick_sort(struct Node *arr, int l, int r) //对结束时间进行排序
{
if (l < r) //进行判断,用来终止递归
{
int i = l, j = r, x = arr[l].value;
struct Node temp = arr[l]; //用来交换结构体数组变量
while (i < j)
{
while (i < j && x <= arr[j].value) //从右往左找一个小于x的数
j--;
if (i < j)
arr[i++] = arr[j];
while (i < j && x > arr[i].value) //从左往右找一个大于x的数
i++;
if (i < j)
arr[j--]= arr[i];
}
arr[i] = temp;
quick_sort(arr, l ,i - 1); //递归调用,分治思想,左边分治。
quick_sort(arr, i + 1, r); //右边分治
}
}
int main()
{
int s, i, j;
scanf("%d",&s);
while (s--) //s组测试数据
{
int n;
double m, total_value = 0, total_weight = 0; //m为背包所能装的最大重量
scanf("%d%lf",&n, &m);
for (i = 0; i < n; i++)
scanf("%lf%lf",&a[i].value, &a[i].weight);
quick_sort(a, 0, n - 1);
for (i = n - 1; i >= 0; i--)
{
if (total_weight + a[i].weight <= m)
{
total_weight += a[i].weight;
total_value += a[i].value * a[i].weight;
}
else
break;
}
total_value += (m - total_weight) * a[i].value;
printf("%d\n",(int)total_value);
}
return 0;
}
背包问题
最新推荐文章于 2025-03-19 08:00:20 发布