リュックサック問題多重リュックサック問題
5970 ワード
多重リュックサック問題
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
コード:
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;
}