(ssl 2291)パケットバックパック
1411 ワード
リュックサックを組む
Time Limit:10000MS Memory Limit:65536K Total Submit:65 Accepted:47 Case Time Limit:1000MS
Description
N個の品物とV容量のリュックサックがあります.i番目の品物の費用はc[i]、価値はw[i]です.これらのアイテムはいくつかのグループに分けられ、各グループのアイテムは互いに衝突し、最大1つを選択します.リュックサックにどのアイテムを入れるかを解くと、これらのアイテムの費用の合計がリュックサックの容量を超えず、価値の合計が最大になります.
Input
第1行:3つの整数、v(リュックサック容量、v<=200)、n(物品数、n<=30)、t(最大グループ番号、t<=10)、第2.n+1行:各行の3つの整数wi、ci、pは、各物品の重量、価値、所属グループ番号を表す.
Output
1行のみ、1つの数で、最大の総価値を表します.
Sample Input
10 6 3
2 1 1
3 3 1
4 8 2
6 9 2
2 8 3
3 9 3
Sample Output
20
Source
var
c,w,f:array[0..1000]of longint;
a:array[0..100,0..100]of longint;
n,v,t,g,i,j,k:longint;
function max(a,b:longint):longint;
begin
if a>b then exit(a);
exit(b);
end;
begin
readln(v,n,t);
for i:=1 to n do
begin
readln(w[i],c[i],g);
inc(a[g,0]);// +1
a[g,a[g,0]]:=i;
end;
for i:=1 to t do// = t
for j:=v downto 0 do
for k:=1 to a[i,0] do
if j>=w[a[i,k]] then
f[j]:=max(f[j],f[j-w[a[i,k]]]+c[a[i,k]]);
writeln(f[v]);
end.