寝癖頭の解法

学習中の覚え書きを投稿、更新していきます。

Aizu Online Judge in C++ #DPL_1_F : 0-1 Knapsack Problem II

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/