【算法分析】
本题是“01背包问题”的变形,如果我们把总钱数看作背包可容重量,把希望购买物品的个数看作要放进背包的物品的数量,把物品的价格看作物品的重量,把物品的价格与物品的重要度的乘积看作物品的价值,本题就完全变成了“01背包问题”。我们再根据下图可得出程序。
i:前i个物品 j:背包剩余可容重量 w:第i个物品的重量 r:第i个物品的价值
i=0 f[i,j]=0
i>0 f[i,j]=max{f[i-1,j],f[i-1,j-w]+r}
【程序清单】
program happy(input,output);
var
i,j,m,n:longint;
w,r:array[1..25] of longint;
a:array[0..1,-10000..100000] of longint;
begin
assign(input,'happy.in');reset(input);
assign(output,'happy.out');rewrite(output);
read(n,m);
for i:=1 to m do
begin
read(w,r);
r:=r*w;
end;
for i:=1 to m do
begin
a[1]:=a[0];
for j:=w to n do
if a[0,j-w]+r>a[1,j] then a[1,j]:=a[0,j-w]+r;
a[0]:=a[1];
end;
writeln(a[1,n]);
close(input);close(output);
end.
【考察知识点】
“动态规划-01背包问题”的应用。