所以我已经写了一个背包问题的代码,但是我不知道我应该如何根据每单位重量的利润(排列数组)对利润(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);
}
答案 0 :(得分:2)
@Cool Dudde建议从(数组的结构)切换到结构的数组可以使代码更易于理解。
但是随后您可以更进一步,使背包适应新的struct数组:
更改knapsack
以使用迭代器而不是数组(指针是随机访问迭代器,因此您只需对其余代码进行少量更改即可测试更改)。 knapsack
的签名看起来像这样:
template<class It>
void knapsack(It begin, It end, int m);
struct
和class
的{{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]将是一些项目的权重。