description
無聊中的小x玩起了diablo i...
遊戲的主人公有n個魔法
每個魔法分為若干個等級,第i個魔法有p[i]個等級(不包括0)
每個魔法的每個等級都有乙個效果值,乙個j級的i種魔法的效果值為w[i][j]
魔法公升一級需要一本相應的魔法書
購買魔法書需要金幣,第i個魔法的魔法書**為c[i]
而小x只有m個金幣(好孩子不用修改器)
你的任務就是幫助小x決定如何購買魔法書才能使所有魔法的效果值之和最大
開始時所有魔法為0級 效果值為0
input
第一行 用空格隔開的兩個整數n(0
以下n行 描述n個魔法
第i+1行描述 第i個魔法 格式如下(0
<=50,
<="10)">
c[i] p[i] w[i][1] w[i][2] ... w[i][p[i]]
output
第一行輸出乙個整數,即最大效果
sample input
3 101 3 1 2 2
2 3 2 4 6
3 3 2 1 10
sample output
11103
hint
0< n< =100,0< m <=500,0 < p[i] <= 50,0 < c[i] <=10
解題思路:
這是乙個多重揹包。
不過比普通的完全揹包要多乙個記錄路徑,最後先輸出最優值,再輸出路徑即可。
時間複雜度:o(v*∑a[i,0])
程式:var n,m,s,a1,x,i,j,k,max:longint;
a,f1:array[0..500,0..500] of longint;
w,t,f,c,f2:array[0..10000] of longint;
begin
readln(n,m);
for i:=1 to n do
begin
read(c[i],a[i,0]);
for j:=1 to a[i,0] do
begin
read(x);
inc(a1);
w[a1]:=c[i]*j;
t[a1]:=x;
a[i,j]:=a1;
end;
readln;
end;
for k:=1 to n do
for j:=m downto 0 do
for i:=1 to a[k,0] do
if j>=w[a[k,i]] then
if f[j-w[a[k,i]]]+t[a[k,i]]>f[j] then
begin
f[j]:=f[j-w[a[k,i]]]+t[a[k,i]];
f1[k,j]:=i;
end;
writeln(f[m]);
for i:=m downto 0 do
if f[i]>=max then begin max:=f[i]; j:=i; end;
for i:=n downto 1 do
begin
f2[i]:=f1[i,j];
j:=j-c[i]*f2[i];
end;
for i:=1 to n do
writeln(f2[i]);
end.
版權屬於: chris
暗黑破壞神
description 無聊中的小x玩起了diablo i.遊戲的主人公有n個魔法 每個魔法分為若干個等級,第i個魔法有p i 個等級 不包括0 每個魔法的每個等級都有乙個效果值,乙個j級的i種魔法的效果值為w i j 魔法公升一級需要一本相應的魔法書 購買魔法書需要金幣,第i個魔法的魔法書 為c ...
暗黑破壞神
暗黑破壞神 time limit 10000ms memory limit 65536k total submit 100 accepted 35 case time limit 1000ms description 無聊中的小x玩起了diablo i.遊戲的主人公有n個魔法 每個魔法分為若干個等級...
暗黑破壞神
description 無聊中的小x玩起了diablo i 遊戲的主人公有n個魔法 每個魔法分為若干個等級,第i個魔法有p i 個等級 不包括0 每個魔法的每個等級都有乙個效果值,乙個j級的i種魔法的效果值為w i j 魔法公升一級需要一本相應的魔法書 購買魔法書需要金幣,第i個魔法的魔法書 為c ...