背包问题
描述
现在有很多物品(它们是可以分割的),我们知道它们每个物品的单位重量的价值v和重量w(1<=v,w<=10);如果给你一个背包它能容纳的重量为m(10<=m<=20),你所要做的就是把物品装到背包里,使背包里的物品的价值总和最大。
输入
第一行输入一个正整数n(1<=n<=5),表示有n组测试数据;
随后有n测试数据,每组测试数据的第一行有两个正整数s,m(1<=s<=10);s表示有s个物品。接下来的s行每行有两个正整数v,w。
输出
输出每组测试数据中背包内的物品的价值和,每次输出占一行。
样例输入
1
3 15
5 10
2 8
3 9
样例输出
65
代码实现
#include <iostream>
using namespace std;
int m,n;
int s,values[11],weights[11];
void quickSort(int low,int high)
{
int i = low,j = high;
int pivot = values[(low+high)/2];
while(i <= j)
{
while(values[i] > pivot)
i++;
while(values[j] < pivot)
j--;
if(i <= j)
{
int temp = values[i];
values[i] = values[j];
values[j] = temp;
temp = weights[i];
weights[i] = weights[j];
weights[j] = temp;
i++;
j--;
}
}
if ( j > low)
quickSort(low,j);
if (i < high)
quickSort(i,high);
}
void work(int s,int m)
{
int i = 1;
int totalValue = 0;
do{
if(m == 0)
{
break;
}
m -= weights[i];
if (m >= 0)
{
totalValue += values[i]*weights[i];
}
else
{
totalValue += values[i] * (m + weights[i]);
}
i++;
}while (m > 0 && i <= s);
cout << totalValue << endl;
}
int main()
{
cin >> n;
while(n--)
{
cin >> s >> m;
for(int i = 1; s >= i;i++)
{
cin >> values[i] >> weights[i];
}
quickSort(1,s);
work(s,m);
}
return 0;
}