前提・実現したいこと
問題:N 個の品物があります。i 番目の品物はそれぞれ重さと価値が w(i) v(i) となっています (0≤i≤N−1)。
これらの品物から重さの総和が W を超えないように選んだときの、価値の総和の最大値を求めてください。
入力は次の形式で与えられます。
N W
w(0) v(0)
w(1) v(1)
⋮
w(N-1) v(N-1)
問題URL : https://algo-method.com/tasks/308
発生している問題・エラーメッセージ
自分のコードでは不正解の理由がわからないです。自分的にはアルゴリズムは合っていると思うのですが、
該当のソースコード
c++
1#include <bits/stdc++.h> 2using namespace std; 3 4int main(){ 5 int N,W; 6 cin >> N >> W; 7 int W[110],V[110]; 8 for(int i=0;i<N;i++) cin >> w[i] >> V[i]; 9 10 vector<vector<int>> dp(N+1, vector<int>(W + 1 , -1000)); //縦個数、横重さで実装 11 dp[0][0] = 0; 12 13 for(int i=0;i<N;i++){ 14 for(int j=0;j<W;j++){ 15 if(dp[i][j] >= 0){ 16 dp[i+1][j] = dp[i][j]; //何も選ばない場合はそのまま 17 if(j+w[i] < W){ 18 dp[i+1][j+w[i]] = max(dp[i+1][j+w[i]] , dp[i][j] + V[i]); //i個目の重さ分増えた場所の価値は、もともとそこにあった価値と、dp[i][j]に価値を足したものの最大値 19 } 20 } 21 } 22 } 23 24 int res = -111110; 25 26 for(int j=0;j<W;j++){ 27 if(dp[N][j] > res) res = dp[N][j]; //N個目選んだ時の様々な重さでの最大値が答え 28 } 29 30 cout << res << endl; 31 32 33}
試したこと
ここに問題に対して試したことを記載してください。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/01/04 03:04
2022/01/04 03:24