可分割背包问题

题目描述

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

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

输入格式

第一行输入一个正整数\(n\) \((1\le n\le 5)\),表示有 \(n\) 组测试数据; 随后有 \(n\) 测试数据,每组测试数据的第一行有两个正整数\(s,m\)\((1\le s\le 10)\); \(s\)表示有 \(s\) 个物品。

接下来的 \(s\) 行每行有两个正整数 \(v,w\)

输出

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

样例

样例输入

1
3 15
5 10
2 8
3 9

样例输出

65

样例解释

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

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

总价值\(=5 \times 10 + 3 \times 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 @ 2023-07-01 09:52  Momo·Trace  阅读(33)  评论(0编辑  收藏  举报