求PASCAL背包问题和无限背包思路和程序

来源:百度知道 编辑:UC知道 时间:2024/05/24 05:50:42
求高手详解

01背包:
fillchar(f,sizeof(f),0);{f数组初始化为0}
read(数量,总钱数);
for i:=1 to 数量 do begin
read(价钱,价值);
for j:=总钱数 DOWNTO 价钱 do
if f[j]<f[j-价钱]+价值 then f[j]:=f[j-价钱]+价值
end;
无限背包:
把01背包里面的“总钱数 DOWNTO 价钱”改成“价钱 TO 总钱数”.我也在找这个玩艺。分享一下 就是多重背包吧 好办
n种物品 每种物品重量是w[i] 价值是v[i] 重量要求不超过sum
代码如下
var w,v:array[1..1000]of longint;
f:array[0..10000]of longint;
i,j,n,sum:longint;
begin
readln(n); readln(sum);
for i:=1 to n do
readln(w[i],v[i]);
f[0]:=0;
for i:=1 to sum do
for j:=1 to n do
if(i-w[j]>=0)and(f[i]<f[i-w[j]]+v[j])
then f[i]:=f[i-w[j]]+v[j];
writeln(f[sum]);
end.
具体的数据范围lz可以自己修改
背包问题
部分背包问题可有贪心法求解:计算Pi/Wi
数据结构:
w[i]:第i个背包的重量; p[i]:第i个背包的价值;
(1)每个背包只能使用一次或有限次(可转化为一次):
A.求最多可放入的重量。
NOIP2001 装箱问题
有一个箱子容量为v(正整数,o≤v≤20000),同时有n个物品(o≤n≤30)每个物品有一个体积 (正整数)。要求从 n 个物品中,任取若千个装入箱内,使箱子的剩余空间为最小。
l 搜索