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

动态规划练习题(2)

时间:2016-04-19 00:31:56      阅读:193      评论:0      收藏:0      [点我收藏+]

标签:

1、完全背包(knapsack.pas)

AYYZOJ p1473

技术分享
 1 program p1473;
 2 const
 3   maxm=200; maxn=30;
 4 var
 5   i,j,n,m:integer;
 6   w,u:array[1..maxn] of integer;
 7   f:array[0..maxn,0..maxm] of integer;
 8 begin
 9   fillchar(w,sizeof(w),0);
10   fillchar(u,sizeof(u),0);
11   readln(m,n);
12   for i:=1 to n do readln(w[i],u[i]);
13   for i:=1 to n do
14    begin
15      for j:=1 to w[i]-1 do
16       f[i,j]:=f[i-1,j];
17      for j:=w[i] to m do
18       if f[i-1,j]>f[i,j-w[i]]+u[i] then f[i,j]:=f[i-1,j]
19           else f[i,j]:=f[i,j-w[i]]+u[i];
20    end;
21   writeln(f[n,m]);
22 end.
参考程序

2、货币系统(money.pas)

AYYZOJ p1133

COGS p698

统计完全背包方案数

技术分享
 1 const
 2   maxv=25;
 3 var
 4   v,n,i,j,k,t:longint;
 5   a:array[1..maxv] of longint;
 6   f:array[0..maxv,0..10000] of int64;
 7 begin
 8   assign(input,moneysys.in); reset(input);
 9   assign(output,moneysys.out); rewrite(output);
10   readln(v,n);
11   for i:=1 to v do
12     read(a[i]);
13   for i:=0 to v do f[i,0]:=1;
14   for i:=1 to v do
15     for j:=1 to n do
16     begin
17           f[i,j]:=f[i-1,j];
18       if j>=a[i] then
19         f[i,j]:=f[i,j]+f[i,j-a[i]];
20     end;
21   writeln(f[v,n]);
22   close(input); close(output);
23 end.
我的程序
技术分享
 1 var
 2 v,n,i,j:longint;
 3 m:array[0..26] of longint;
 4 f:array[0..26,0..10000] of int64;
 5 begin
 6   assign(input,moneysys.in);reset(input);
 7   assign(output,moneysys.out);rewrite(output);
 8   readln(v,n);
 9   for i:=1 to v do begin read(m[i]);f[i,0]:=1;end;
10   for i:=1 to v do
11     for j:=1 to n do
12       begin
13         f[i,j]:=f[i,j]+f[i-1,j];
14         if j-m[i]>=0 then f[i,j]:=f[i,j]+f[i,j-m[i]];
15       end;
16   writeln(f[v,n]);
17   close(input);
18   close(output);
19 end.
另一程序
技术分享
 1 {设f[i,j]表示用前i种硬币能表示j面额货币的方法数:则f[i,j]=f[i-1,j]+f[i-1,j-a[i]];即前i种硬币能表示j货币的种类=不用第i种硬币能表示的j货币的种类+用上第i种货币能表示j货币的种类。当然这个方程在空间上还可以简化为一维的
 2 }
 3 program money;
 4 var
 5     n,v:integer;
 6     cash:array[1.. 25] of integer;
 7     f:array[0..10000] of qword;
 8 procedure init;
 9 var
10     i:integer;
11 begin
12     readln(v,n);
13     for i:=1 to v do read(cash[i]);
14     readln;
15     end;
16 procedure dp;
17 var
18     i,j,k,l:integer;
19 begin
20     fillchar(f,sizeof(f),0);
21     f[0]:=1;
22     for i:=1 to v do
23         for j:=cash[i] to n do
24             inc(f[j],f[j-cash[i]]);
25     writeln(f[n]);
26 end;
27 begin
28     init;
29     dp;
30 end.
老师给的程序(含思路)

 

动态规划练习题(2)

标签:

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

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