部分背包问题网上都是c++实现,而且使用结构体,这里给小白提供一种c语言方法,并且不需要结构体,只需要数组便可以
#include <stdio.h>
int main()
{
double a[100][2] = { 0 };
int n = 0;
double pp = 0, qq = 0, ss = 0;
double t = 0;
double ave[100] = { 0 };
scanf("%d %lf", &n, &t);//输入金币箱数和背包能够承受的总重量
for (int i = 0; i < n; i++)
{
scanf("%lf %lf", &a[i][0], &a[i][1]);//输入每箱金币的重量和价值
ave[i] = a[i][1] / a[i][0];//计算每箱金币的(重量/价值)
}
for (int i = 0; i < n - 1; i++)
{
for (int j = n-2; j >=i; j--)
{
if (ave[j]<ave[j+1])
{
pp = a[j][0];
a[j][0] = a[j+1][0];
a[j+1][0] = pp;
qq = a[j][1];
a[j][1] = a[j+1][1];
a[j+1][1] = qq;
ss = ave[j];
ave[j] = ave[j + 1];
ave[j + 1] = ss;
}
}
}
double sum = 0;
double value = 0;
int i = 0;
for (i = 0; sum < t && i < n; i++)//按照性价比从高到低装金币
{
sum += a[i][0];
value += a[i][1];
}
if (i != n)
{
sum -= a[i - 1][0];//减去多加的
value -= a[i - 1][1];
value += (t - sum) * a[i - 1][1] / a[i - 1][0];//补齐剩余部分
printf("%.2f", value);
}
else
{
sum = 0;
for (i = 0; i < n; i++)
{
sum += a[i][1];
}
printf("%.2f", sum);
}
return 0;
}