The univ|

Momo·Trace

园龄:3年3个月粉丝:6关注:1

可分割背包问题

题目描述

现在有很多物品(它们是可以分割的),我们知道它们每个物品的单位重量的价值v重量w 1v,w10

如果给你一个背包它能容纳的重量为m 10m20,你所要做的就是把物品装到背包里,使背包里的物品的价值总和最大。

输入格式

第一行输入一个正整数n 1n5,表示有 n 组测试数据; 随后有 n 测试数据,每组测试数据的第一行有两个正整数sm1s10; s表示有 s 个物品。

接下来的 s 行每行有两个正整数 vw

输出

输出每组测试数据中背包内的物品的价值和,每次输出占一行。

样例

样例输入

1
3 15
5 10
2 8
3 9

样例输出

65

样例解释

背包容量为15,有3个物品,第一个物品重量为10,单位价值为5,第二个物品重量为8,单位价值为2,第三个物品重量为9,单位价值为3;

放置方案,第一个物品全部放进去,第三个物品放5个单位的重量进去

总价值=5×10+3×5

代码

#include <bits/stdc++.h>
using namespace std;
int n,s,m,ans;
struct node{
int v,w;
}a[20];
bool cmp(node a,node b)
{
return a.v>b.v;
}
int main()
{
cin >> n;
for(int cs=1;cs<=n;cs++)
{
ans=0;
cin >> s >> m;
for(int i=1;i<=s;i++)
{
cin >> a[i].v >> a[i].w;
}
sort(a+1,a+s+1,cmp);
for(int i=1;i<=s;i++)
{
if(m>=a[i].w)
{
m-=a[i].w,ans+=a[i].w*a[i].v;
}
else{
ans+=m*a[i].v;
break;
}
}
cout << ans << endl;
}
return 0;
}
posted @   Momo·Trace  阅读(45)  评论(0编辑  收藏  举报
评论
收藏
关注
推荐
深色
回顶
收起
点击右上角即可分享
微信分享提示