在分数背包中实现的贪婪算法

时间:2017-03-01 16:18:34

标签: c++ greedy

#include <iostream>
#include<vector>
#include<algorithm>
using namespace std;
double fractional_knapsack(vector<int>& val,vector<int>& wt,int    weight)//vectors of values and their respective weights and max weight are   passed as parameter
{
int sz=val.size();
vector<double> ratio(sz); //vector to store ratio of values and weights
for(int i=0;i<sz;i++){
    ratio[i]=double(val[i]/wt[i]);
}
sort(ratio.begin(),ratio.end(),greater());
//reverse(ratio.begin(),ratio.end());
double max=0.0;
int j=0;
while(max<=weight&&j<sz){
        double(weight[j]);
    max=max+(ratio[j]*weight[j]);
}
return max;
}
int main()
{  int max_weight,n;
cin>>n>>max_weight;
vector<int>values;
vector<int>weights;
for(int i=0;i<n;i++){
    cin>>values[i];
}
for(int i=0;i<n;i++){
    cin>>weights[i];
}
double result=fractional_knapsack(values,weights,max_weight);
cout<<"done/n";
cout<<result;
return 0;
}

D:\ COdeBlock Projects \ Fractional Knapsack \ main.cpp | 12 | error:在&#39;之前缺少模板参数(&#39; token |

它正在devcpp中编译但是program_name.exe正在崩溃

方法fractional_knapsack(vector<int>& val,vector<int>& wt,int weight)中的

为什么我们将向量作为参考传递。

2 个答案:

答案 0 :(得分:0)

快速查看错误消息可以发现问题在于线路 sort(ratio.begin(),ratio.end(),greater());

我的猜测是你想要的 sort(ratio.begin(),ratio.end(),greater<double>());

sort方法需要一个比较器。如果您查看doc以获取更高版本,则会有一个如何使用它的示例。

答案 1 :(得分:0)

我得到了正确的代码。

#include <iostream>
#include<vector>
#include<algorithm>
using namespace std;
double fractional_knapsack(vector<int>& val,vector<int>& wt,int   weight)//vectors of values and their respective weights and max weight are passed as parameter
{
int sz=val.size();

vector<double> ratio(sz); //vector to store ratio of values and weights

for(int i=0;i<sz;i++){
    ratio[i]=(val[i]/wt[i]);
}
for(int i=0;i<sz;i++){
for(int j=i+1;j<sz;j++){
    if(ratio[i]<ratio[j]){
        int temp;
        temp=ratio[i];
        ratio[i]=ratio[j];
        ratio[j]=temp;

        temp=val[i];
        val[i]=val[j];
        val[j]=temp;

        temp=wt[i];
        wt[i]=wt[j];
        wt[j]=temp;
    }
 }
}

//sort(ratio.begin(),ratio.end(),greater<double>());
// sort(val.begin(),val.end(),greater<int>());
//sort(wt.begin(),wt.end(),greater<int>());
//reverse(ratio.begin(),ratio.end());

double max=0.0;
int j=0;

int quantity_left =weight;
while(wt[j]<=quantity_left&&j<sz){
        //double(wt[j]);

    max=max+(ratio[j]*wt[j]);
    cout<<max<<" ";
    quantity_left=quantity_left-wt[j];
    j++;

}
if(wt[j]>quantity_left&&j<sz){
    max=max+(ratio[j]*quantity_left);
   // cout<<max<<" ";
}

return max;
}
int main()
{  int max_weight,n;
cin>>n>>max_weight;
vector<int>values(n);
vector<int>weights(n);
for(int i=0;i<n;i++){
    cin>>values[i];
}
for(int i=0;i<n;i++){
    cin>>weights[i];
}
double result=fractional_knapsack(values,weights,max_weight);

cout<<result;
return 0;
}