もういちど ナップサックを 書いてみる(5 7 5)
もう何度も書いたからソラで書けるはずと思いつつ,二次元配列のvectorの書き方に少し戸惑って見たりする。どうしてこんな面倒な書き方になるのだろう。
世間ではよくchimin,chimaxという関数をつくってやっているけど,そのような関数を作る意味がよくわからない。もっと複雑なコードのときには役に立つのかも知れないけど。
https://onlinejudge.u-aizu.ac.jp/problems/DPL_1_B
#include <bits/stdc++.h> using namespace std; int main(){ int N,W; cin>>N>>W; vector<long long>weight(N),value(N); for(int i=0;i<N;i++){ cin>>value[i]>>weight[i]; } vector<vector<long long>>dp(N+1,vector<long long>(W+1,0)); dp[0][0]=0; for(int i=0;i<N;i++){ for(int j=0;j<=W;j++){ if(j-weight[i]>=0){ dp[i+1][j]=max(dp[i+1][j],dp[i][j-weight[i]]+value[i]); } dp[i+1][j]=max(dp[i+1][j],dp[i][j]); } } cout<<dp[N][W]<<endl; return 0; }