背包问题根据单位重量利润对数组进行排序

时间:2019-02-18 05:57:09

标签: c++

所以我已经写了一个背包问题的代码,但是我不知道我应该如何根据每单位重量的利润(排列数组)对利润(p)和重量(p)数组进行排序?解决我赞赏的问题的方法,请在下面发布

#include<iostream>
using namespace std;

void knapsack(float w[],int m,int n){
    float result[n];//this array holds the final result
    int i;
    for(i=0;i<n;i++){
        result[i]=0.0;
    }
    int rem=m;
    int j;
    for(j=0;j<n;j++){
        if(w[j]>rem){
            break;
        }
        else{
            result[j]=1;
            rem=rem-w[j];
        }
    }
    if(j<n){
        result[j]=rem/w[j];
    }
    for(int k=0;k<n;k++){
        cout<<result[k]<<" ";
    }
}

int main(){
    int n,m;
    cout<<"Enter the number of items"<<endl;
    cin>>n;
    cout<<"Enter capacity of bag"<<endl;
    cin>>m;
    cout<<"Enter the profits"<<endl;
    float p[n],w[n];
    for(int i=0;i<n;i++){
        cin>>p[i];//this array holds the profit of each item
    }
    cout<<"Enter the respective weights"<<endl;
    for(int i=0;i<n;i++){
        cin>>w[i];//this array holds the respective weights of items
    }
    float arrange[n];//This array contains profit per unit weight ratio
    for(int i=0;i<n;i++){
        arrange[i]=p[i]/w[i];
        cout<<arrange[i]<<" ";
    }
    cout<<endl;
    knapsack(w,m,n);

}

2 个答案:

答案 0 :(得分:2)

@Cool Dudde建议从(数组的结构)切换到结构的数组可以使代码更易于理解。

但是随后您可以更进一步,使背包适应新的struct数组:

  • 更改knapsack以使用迭代器而不是数组(指针是随机访问迭代器,因此您只需对其余代码进行少量更改即可测试更改)。 knapsack的签名看起来像这样:

    template<class It>
    void knapsack(It begin, It end, int m);
    
  • 使用具有属性structclass的{​​{1}} / weight项目以及可能的标识符(可以是int或字符串)。我认为使用price会更干净。
  • 然后使用int[2]和@Cool Dudde的解决方案:

    std::vector<Item> items
  • std::sort(items.begin(), items.end(), [](const Item& a, const Item& b) {return (a.price/a.weight) < (b.price/b.weight);}); 不会为items.begin()提供合适的迭代器,但是您可以使用transform-iterator来访问项目的权重。 (/或者您创建一个新数组,将排序结果复制到其中,然后将其用作knapsack的输入)

答案 1 :(得分:1)

通过使用std::vector<int[2]>将利润和权重保持在一起,可能会获得更大的成功,这将为您提供可延展的矢量整数数组(您可以在这里使用除int [2]之外的任何两个整数数据结构) ,然后使用std :: sort函数。

sort函数有时有时难以理解,我有时确实会弄错,但是我相信这是在这种情况下的用法;

std::vector<int[2]> items;
std::sort(items.begin(), items.end(), [](int* a, int* b) {return (a[0]/a[1]) < (b[0]/b[1]);});

其中a [0]和b [0]将是某些项目的获利,而a [1]和b [1]将是一些项目的权重。