需要多少次运行?

时间:2013-12-16 20:53:44

标签: c++

一个人可携带'x'kg。那个人必须移动不同重量的'y'项。如果可以组合并携带多个项目,需要多少次运行?

以下是我认为代码的开头应该是:

#include "Item.h"
using namespace std;


int main()
{
  Item A[10];
  int t; 
  string name1; int weight1;
  ifstream read("File.txt");
  read >> t;
    for (int i = 0; i < t; i++){
      read >> name1 >> weight1;
      A[i].Set(name1, weight1);
    }
  read.close();
  //find maximum weight item:
  int r = 0;
    for (int i = 0; i < t; i++){
     if (A[i].GetWeight() > A[r].GetWeight())
     r = i;
    }
     int maxItemWeight = A[r].GetWeight();
     cout << A[r].GetWeight();

    int carryWeight = 100; //How much weight a person can carry at once
    int times; // Times to carry all the items

    if (maxItemWeight > carryWeight)
        cout << "It's impossible to carry all the items " << endl;
    else {
          //Any advice for this part????
     }


    cout << "Times to carry all the items: " << times << endl;
    return 0;
  }

2 个答案:

答案 0 :(得分:4)

假设您首先将物品放入箱子中,每个箱子最多可包含60公斤。将所有物品放入垃圾箱后,您就可以确切知道需要多少次旅行。只需计算使用的垃圾箱数量。

这是一个糟糕的算法:将一个项目放入它适合的第一个bin中。它是O(n),所以它很快。假设你的阵列包含6个10千克的物品,然后是6个50千克的物品。该算法将前六个10千克的物品放在一个箱子里,将其装满。剩下的六个项目必须放在不同的垃圾箱里,所以总共有7个垃圾箱。如果您只是从另一端攻击了问题,那么您将找到六个箱的最佳解决方案,因此可以进行六次旅行。该算法有时可以将二进制数量夸大两倍。

排序有帮助,但并不能保证最佳性。任何多项式时间算法都可以夸大所需的箱数量22%。排序是达到22%数字的关键。最佳解决方案必须耗尽所有可能的安排。您可以使用回溯来完成此任务。另一方面,在最优的22%范围内的O(n * log(n))算法可能已经足够好了。

如果你谷歌“垃圾箱包装问题”你会发现很多关于这个问题的文献,因为这个问题有很多工业应用。

答案 1 :(得分:1)

我可能先从拿起最重的物品开始。然后找到你可以拿起的下一个最重的物品。继续搜索,直到您无法再获取任何商品。保存该配置。

删除第一项以外的所有内容。找到你可以拿到的第二重物品。继续搜索,直到您无法再接听为止。

保持这样的循环,保存每个配置,然后实际携带具有最多数量的包的配置。如果有领带,请使用最重的单项组合。

我不是声称这是最佳的,但我认为它应该有用。