2016-09-30 6 views
0

まず、オブジェクトの値とオブジェクトの重みの比で要素をソートすることで分数型ナップザックを実装しようとしています。私はペアのベクトルを使用しています。ペアの最初の要素はオブジェクトの値で、ペアの2番目の要素はウェイトです。 compbyrat関数は、ベクトル要素を値に対する重みの比で比較するための関数です。私は以下のコードでランタイムエラーが発生しています。誰も私が間違いを見つけるのを助けることができますか?フラクショナルナップザックを実装する

#include <iostream> 
#include<algorithm> 
#include<vector> 
#include<utility> 
using namespace std; 
bool compbyrat(const pair<long long int,long long int> &a, const pair<long long int,long long int> &b) 
{ 
    return ((double)a.first/(double)a.second)< ((double) b.first/(double) b.second) ; 
} 
int main() { 
    long long int n, weight; 
    vector<pair<long long int,long long int> > v; 
    cin>>n>>weight; 
    for(long long int i = 0; i < n; i++){ 
     cin>>v[i].first>>v[i].second; 
    } 

    sort(v.begin(), v.end(), compbyrat); 
    long long int currentweight = 0, ans =0; 
    for(long long int i =0; i < n && currentweight < weight; i++){ 
     if(currentweight + v[i].second <= weight){ 
      ans = ans + v[i].first; 
     } 
     else{ 
      ans = ans + (((double)v[i].first/(double)v[i].second) * (weight -currentweight)); 
     } 
    } 
    cout<<ans; 
    return 0; 
} 
+2

最初は、ベクターを初期化していません。 nと重みを読んだ後に、 "v.resize(n)"行を追加してください。空のベクトルの要素にアクセスするのはUBです。 –

+1

このような問題を解決する適切なツールは、デバッガです。スタックオーバーフローを尋ねる前に、コードを一行ずつ進める必要があります。詳しいヘルプは、[小さなプログラムをデバッグする方法(Eric Lippert)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)を参照してください。最低でも、あなたはあなたが行った観察と一緒に、[編集]あなたの質問あなたの問題を再現[、最小完全、かつ検証](http://stackoverflow.com/help/mcve)の例を含むようにする必要があります\しますデバッガ。 –

+0

ありがとうございます。とった。 C++でのコーディングを開始して2年後には、多くのことを忘れてしまった。 –

答えて

0

いくつかの変更を加えて解決できました。コードは次のとおりです。

#include <iostream> 
#include<algorithm> 
#include<vector> 
#include<utility> 
#include<iomanip> 
using namespace std; 
bool compbyrat(const pair<long long int,long long int> &a, const pair<long long int,long long int> &b) 
{ 
    return ((double)((double)a.first/(double)a.second)> (double)((double) b.first/(double) b.second)) ; 
} 
int main() { 
    long long int n, weight; 
    cin>>n>>weight; 

    vector<pair<long long int,long long int> > v(n+2); 
    for(long long int i = 0; i < n; i++){ 
     cin>>v[i].first>>v[i].second; 
    } 

    sort(v.begin(), v.end(), compbyrat); 
    //cout<<v[0].first; 
    long long int currentweight = 0; 
    double ans = 0.0000; 
    for(long long int i =0; i < n && currentweight < weight; i++){ 
     if(currentweight + v[i].second <= weight){ 
      ans = ans + v[i].first; 
      currentweight = currentweight + v[i].second; 
      //cout<<v[i].first<<" "<<v[i].second<<endl; 
     } 
     else{ 
      ans = ans + ((double)((double)v[i].first/(double)v[i].second) * (weight -currentweight)); 
      currentweight = currentweight + v[i].second; 
     } 


    } 
    cout<<fixed << setprecision(4)<<ans; 
    return 0; 
} 
関連する問題