首页 > 学院 > 开发设计 > 正文

完全背包(一维数组版)

2019-11-06 07:48:14
字体:
来源:转载
供稿:网友

Description 设有n 种物品,每种物品有一个重量及一个价值。但每种物品的数量是无限的,同时有一个背包,最大载重量为M,今从n 种物品中选取若干件(同一种物品可以多次选取),使其重量的和小于等于M,而价值的和为最大。

Input 第一行:两个整数,M(背包容量,M<= 200)和N(物品数量,N<= 30); 第2..N+1 行:每行二个整数Wi,Ui,表示每个物品的重量和价值。

Output 仅一行,一个数,表示最大总价值。

Sample Input 12 4 2 1 3 3 4 5 7 9

Sample Output 15

说明 本问题的数学模型如下(状态转移方程),设 f(x)表示重量不超过x公斤的最大价值。 则 f(x)=max{f(x-w[i])+c[i]} 当x>=w[i] 1<=i<=n (可理解为如果更有价值的就替换,用二维数组也可)。 for i:=1 to m do //以重量分阶段 for j:=1 to n do //价值 begin if i>=w[j] then t:=f[i-w[j]]+p[j]; if t>f[i] then f[i]:=t end;

var i,j,n,m,t:longint; w,p,f:array[0..2000]of longint;begin readln(m,n); for i:=1 to n do readln(w[i],p[i]); for i:=1 to m do for j:=1 to n do begin if i>=w[j] then t:=f[i-w[j]]+p[j]; if t>f[i] then f[i]:=t; end; writeln(f[m]);end.
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表