背包问题

题目描述

背包限定体积为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;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值