リュックサック問題多重リュックサック問題


多重リュックサック問題
N種類の品物と1つの容量がVのリュックサックがあります.i番目の品物は最大si品で、1枚の体積はviで、価値はwiです.
リュックサックにどのアイテムを入れるかを解くと、アイテムの体積の合計がリュックサックの容量を超えず、価値の合計が最大になります.最大値を出力します.
入力フォーマット
1行目の2つの整数,N,Vは,物品種数とリュックサック容積をそれぞれ表すスペースで区切られている.次にN行があり、各行の3つの整数vi,wi,siは、i番目の物品の体積、価値、数量をそれぞれ表すスペースで区切られている.
出力フォーマット
最大値を表す整数を出力します.データ範囲0
入力サンプル
4 5 1 2 3 2 4 1 3 4 3 4 5 2
出力サンプル:
10
コード:
#include
using namespace std;

const int MAXN = 1005;
int w[MAXN];    //    
int v[MAXN];    //    
int s[MAXN];    //      
int f[MAXN];    // f[i][j], j    i         


int main() 
{
    int n;
    int m;  //      
    cin >> n >> m;
    for(int i = 1; i <= n; ++i) 
        cin >> w[i] >> v[i] >> s[i];

    for(int i = 1; i <= n; ++i)
        for(int j = m; j>=0; --j)   
            for(int k = 1; k <= s[i]; ++k) 
                if(j>=k*w[i])
                    f[j] = max(f[j], f[j-k*w[i]]+k*v[i]);

    cout << f[m] << endl;

    return 0;
}