背包问题的基础问题
思路:
1、背包问题是在有限空间内保证装的物品价值尽可能大。
2、思路就是求出物品的单位价值 对单位价值进行排序,然后通过单位价值寻找价值最大化 公式:单位价值=物品的价值/物品的质量。
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <string>
#include <queue>
#include <stack>
#include <map>
#include <set>
typedef long long LL;
using namespace std;
struct bag
{
LL weight;
LL value;
float dw_val;
} Bag[1000000];
bool cmp(bag a,bag b)
{
return a.dw_val > b.dw_val;
}
int main()
{
LL n,N;
cin >> n >> N; //输入物品的数量 背包的最大容量;
for(int i=0; i<n; i++)
{
cin >> Bag[i].weight >> Bag[i].value;
Bag[i].dw_val=(float)Bag[i].value/Bag[i].weight; //求单位价值
}
sort(Bag,Bag+n,cmp);
LL sum=0,sum2=0;
for(int i=0; i<n; i++)
{
if(sum2+Bag[i].weight>N) // 计算背包容量是否够用
break;
sum2+=Bag[i].weight;
sum+=Bag[i].value;
}
cout << sum << endl;
}