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;
}
最初は、ベクターを初期化していません。 nと重みを読んだ後に、 "v.resize(n)"行を追加してください。空のベクトルの要素にアクセスするのはUBです。 –
このような問題を解決する適切なツールは、デバッガです。スタックオーバーフローを尋ねる前に、コードを一行ずつ進める必要があります。詳しいヘルプは、[小さなプログラムをデバッグする方法(Eric Lippert)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)を参照してください。最低でも、あなたはあなたが行った観察と一緒に、[編集]あなたの質問あなたの問題を再現[、最小完全、かつ検証](http://stackoverflow.com/help/mcve)の例を含むようにする必要があります\しますデバッガ。 –
ありがとうございます。とった。 C++でのコーディングを開始して2年後には、多くのことを忘れてしまった。 –