可分割背包问题
题目描述
现在有很多物品(它们是可以分割的),我们知道它们每个物品的单位重量的价值\(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;
}
本文来自小默的博客,转载请注明原文链接:https://www.cnblogs.com/momotrace/p/separable-knapsack-problem.html