码迷,mamicode.com
首页 > 其他好文 > 详细

0/1背包

时间:2016-04-18 01:02:10      阅读:193      评论:0      收藏:0      [点我收藏+]

标签:

技术分享

技术分享

 1 program package;
 2 const 
 3   maxm=200;maxn=30;
 4 var 
 5   m,n,j,i:integer;
 6   c,w: array[1..maxn] of integer;
 7   f:array[0..maxn,0..maxm] of integer;
 8 function max(x,y:integer):integer;            //求x和y的最大值
 9 begin
10   if x>y then max:=x else max:=y;
11 end;
12 
13 BEGIN 14 assign(input,package.in); 15 assign(output,package.out); 16 reset(input); 17 rewrite(output); 18 readln(m,n); //背包容量m和物品数量n 19 for i:= 1 to n do 20 readln(w[i],c[i]); //每个物品的重量和价值 21 for i:=1 to n do 22 for j:=1 to m do 23 begin // f(i,x)表示前i件物品,总重量不超过x的最优价值 24 if j>=w[i] then f[i,j]:=max(f[i-1,j-w[i]]+c[i],f[i-1,j]) 25 else f[i,j]:=f[i-1,j]; 26 end; 27 writeln(f[n,m]); //f(n,m)为最优解 28 close(input); 29 close(output); 30 END.

使用二维数组存储各子问题时方便,但当maxm较大时不能定义二维数组f,怎么办,其实可以用一维数组。

技术分享

 

 1 program star_package;
 2 var
 3     i,j,k,n,m:longint;
 4     f:array[0..100000]of longint;
 5     w,c:array[0..2000]of longint;
 6 begin
 7   assign(input,package.in);
 8   assign(output,package.out); 
 9   reset(input);
10   rewrite(output);
11   fillchar(f,sizeof(f),0);
12   readln(m,n);                                //背包容量m和物品数量n
13   for i:=1 to n do 
14      readln(w[i],c[i]);                        //每个物品的重量和价值
15   for i:=1 to n do
16     for j:=m downto w[i] do                    //这里不能写成for j:=w[i] to m
17       if f[j-w[i]]+c[i]>f[j] then f[j]:=f[j-w[i]]+c[i];    // f(j)表示重量不超过j公斤的最大价值
18   writeln(f[m]);
19   close(input);
20   close(ouptut);
21 end.

 

0/1背包

标签:

原文地址:http://www.cnblogs.com/vacation/p/5402890.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!