Aizu Online Judge(AOJ)の過去問から、その提出コードの解答例です。
・問題 "0-1 Knapsack Problem II"
https://onlinejudge.u-aizu.ac.jp/problems/DPL_1_F
・0-1 ナップザック問題 II
僕が作成、提出したコードは、以下のとおりです。
Aizu Online Judge in C++ #DPL_1_F : 0-1 Knapsack Problem II
/* Aizu Online Judge in C++ #DPL_1_F : 0-1 Knapsack Problem II https://onlinejudge.u-aizu.ac.jp/problems/DPL_1_F 提出コードの解答例 https://neguse-atama.hatenablog.com */ #include<bits/stdc++.h> using namespace std; const int inf=1<<30; int dp[101][10001]={}; int main(void){ int N,W; cin>>N>>W; int v[N],w[N]; for(int i=0;i<N;i++){ cin>>v[i]>>w[i]; } int maximum=0; for(int i=0;i<N;i++){ maximum=max(maximum,v[i]); } for(int i=1;i<=N*100;i++){ dp[0][i]=inf; } for(int i=0;i<N;i++){ for(int j=1;j<=N*maximum;j++){ if(j<v[i]){ dp[i+1][j]=dp[i][j]; }else{ dp[i+1][j]=min(dp[i][j],dp[i][j-v[i]]+w[i]); } } } int ans=0; for(int i=0;i<=N*maximum;i++){ if(dp[N][i]<=W){ ans=i; } } cout<<ans<<endl; return 0; }
設問の出典は、プログラミング問題のオンライン採点システム「Aizu Online Judge(AOJ)」です。
http://judge.u-aizu.ac.jp/onlinejudge/