阿里巴巴和四十大盗(背包问题)

问题描述:

阿里巴巴闯进了四十大盗的宝藏山洞,山东一共有n种宝物,每种宝物有一定的重量w和相应的价值v,毛驴只能运走m重量的宝物,一种宝物只能拿一样,宝物可以分割,怎样才使价值最大呢?

问题分析:

要在规定的重量内使得价值最大,则要使得物品的价值重量比最大(性价比),维护一个结构体(包含重量、价值、性价比)。对性价比进行从大到小排序,依性价比从高到底的拿走物品直到下一件物品的重量大于背包还剩下的重量,因为物品可被分割最后还应该加上m*s[i].p

代码:

  1. #include <iostream>
  2. #include <algorithm>
  3. using namespace std;
  4. const int N = 10005;
  5. struct three
  6. {
  7.     double w;
  8.     double v;
  9.     double p;
  10. }s[N];
  11. bool cmp(const three a, const three b)//递减排序
  12. {
  13.     return a.p > b.p;
  14. }
  15. int main()
  16. {
  17.     double m;//承载能力
  18.     int n, i;//n代表物品数
  19.     cin >> n >> m;
  20.     for (i = 0; i < n; i++)
  21.     {
  22.         cin >> s[i].w >> s[i].v;
  23.         s[i].p = s[i].v / s[i].w;//价值重量比
  24.     }
  25.     sort(s, s + n, cmp);
  26.     double sum=0.0;
  27.     for (i = 0; i < n; i++)
  28.     {
  29.         if (m > s[i].w)
  30.         {
  31.             m -= s[i].w;
  32.             sum += s[i].v;
  33.         }
  34.         else//最后一件不够分
  35.         {
  36.             sum = sum + s[i].p*m;
  37.             break;
  38.         }
  39.     }
  40.     cout << sum << endl;
  41.     return 0;
  42. }

猜你喜欢

转载自blog.csdn.net/qq_40327837/article/details/85055899