题目描述
背包限定体积为t(0<t<10000给出n(1<n<100)个物品,选择物品装入背包中,是背包价值总和最大)
输入
K
n t
接下来n行每个物品的价值w,和体积v(0<w,v<1000)
输出
最大的价值(结果保留两位小数)
样例输入
12 76 77 7
样例输出
7.00
源代码如下:
#include<stdio.h>
struct goods
{
double w;
double v;
double r;
}s[100];
int main()
{
goods temp;
int k,i,n,t,j;
double sum,a;
scanf("%d",&k);
while(k--)
{
a=0;
sum=0;
scanf("%d %d",&n,&t);
for(i=0;i<n;i++)
{
scanf("%lf %lf",&s[i].w,&s[i].v);
s[i].r=s[i].w/s[i].v;//将每件物品的价值和体积之比存进数组里
}
for(i=0;i<n;i++)
{
for(j=i;j<n-i-1;j++)
{
if(s[j].r<s[j+1].r)按照价体比进行排序,将价体比高得放在前面。
{
temp=s[j];
s[j]=s[j+1];
s[j+1]=temp;
}
}
}
for(i=0;i<n;i++)
{
sum=sum+s[i].v;//价体比高的体积相加,
{
if(sum>t)若大于最大体积减去最后一个。
{
sum=sum-s[i].v;
break;
}
}
a=a+s[i].w;输出价体比高的物品的价值总和。
}
printf("%.2lf\n",a);
}
return 0;
}
struct goods
{
double w;
double v;
double r;
}s[100];
int main()
{
goods temp;
int k,i,n,t,j;
double sum,a;
scanf("%d",&k);
while(k--)
{
a=0;
sum=0;
scanf("%d %d",&n,&t);
for(i=0;i<n;i++)
{
scanf("%lf %lf",&s[i].w,&s[i].v);
s[i].r=s[i].w/s[i].v;//将每件物品的价值和体积之比存进数组里
}
for(i=0;i<n;i++)
{
for(j=i;j<n-i-1;j++)
{
if(s[j].r<s[j+1].r)按照价体比进行排序,将价体比高得放在前面。
{
temp=s[j];
s[j]=s[j+1];
s[j+1]=temp;
}
}
}
for(i=0;i<n;i++)
{
sum=sum+s[i].v;//价体比高的体积相加,
{
if(sum>t)若大于最大体积减去最后一个。
{
sum=sum-s[i].v;
break;
}
}
a=a+s[i].w;输出价体比高的物品的价值总和。
}
printf("%.2lf\n",a);
}
return 0;
}