#include <stdio.h>
struct Beibao
{
int v;//题意中v为每个物品的单位重量的价值
int w;//每个物体的总重量
};
int main()
{
int k;
Beibao a[11],t;
scanf("%d",&k);
while(k--)
{
int s,m;
scanf("%d%d",&s,&m);//s为物品件数 m为总限重
int i,j;
for(i=0;i<s;i++)
scanf("%d%d",&a[i].v,&a[i].w);
for(i=0;i<s-1;i++)
for(j=i+1;j<s;j++)
{
if(a[i].v<a[j].v)
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
int x=0,y=0;
for(i=0;i<s;i++)
{
if((x+a[i].w)<m)
{
x=x+a[i].w;
y=y+a[i].w*a[i].v;
}
else
{
y=y+(m-x)*a[i].v;//重量加起来不超过限重的就直接计算价值 超过或等于了就分隔算一下在原来价值的基础上又能增加多少 求总和即可
break;
}
}
printf("%d\n",y);
}
return 0;
}
这个一定要看清题意 是单位价值 且这是可分割的背包问题 用贪心算法即可
nyoj106 背包问题
最新推荐文章于 2022-12-03 20:08:55 发布