动态规划练习题(1)

1、0/1背包(package.pas)

AYYZOJ p1472

 1 program p1472;
 2 const
 3   maxm=200; maxn=30;
 4 var
 5   m,n,i,j: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;
 9 begin
10   if x>y then max:=x else max:=y;
11 end;
12 begin
13   readln(m,n);
14   for i:=1 to n do readln(w[i],c[i]);
15   for i:=1 to n do
16    for j:=1 to m do
17     begin
18       if j>=w[i] then f[i,j]:=max(f[i-1,j-w[i]]+c[i],f[i-1,j])
19         else f[i,j]:=f[i-1,j];
20     end;
21  writeln(f[n,m]);
22 end.

参考程序

2、采药(medic.pas)

AYYZOJ p1052

COGS p68

 1 const
 2   maxm=1000; maxn=100;
 3 var
 4   f:array[0..maxn,0..maxm] of integer;
 5   w,c:array[1..maxn] of integer;
 6   m,n,i,j:integer;
 7
 8 function max(x,y:integer):integer;
 9 begin
10   if x>y then max:=x else max:=y
11 end;
12
13 begin
14 assign(input,‘medic.in‘);
15 reset(input);
16 assign(output,‘medic.out‘);
17 rewrite(output);
18   readln(m,n);
19   for i:=1 to n do readln(w[i],c[i]);
20   fillchar(f,sizeof(f),0);
21    for i:=1 to n do
22     for j:=1 to m do
23      if j>=w[i] then f[i,j]:=max(f[i-1,j-w[i]]+c[i],f[i-1,j])
24                else f[i,j]:=f[i-1,j];
25   writeln(f[n,m]);
26 close(input);
27 close(output);
28 end.

参考程序

3、开心的金明(happy.pas)

AYYZOJ p1059

COGS p71

 1 var
 2   f:array[0..30000] of longint;
 3   w,c:array[1..30000] of longint;
 4   i,j,m,n,ans:longint;
 5 begin
 6 assign(input,‘happy.in‘);
 7 reset(input);
 8 assign(output,‘happy.out‘);
 9 rewrite(output);
10   readln(m,n);
11   for i:=1 to n do readln(w[i],c[i]);
12   fillchar(f,sizeof(f),0);
13    for i:=1 to n do
14     for j:=m downto w[i] do
15      if f[j-w[i]]+c[i]*w[i]>f[j] then f[j]:=f[j-w[i]]+c[i]*w[i]
16       else f[j]:=f[j]+c[j]*w[j];
17    writeln(f[m]);
18 close(input);
19 close(output);
20 end.

参考程序1

 1 var
 2   n,m,i,j:integer;
 3   v,p:array[1..25] of longint;
 4   dp:array[0..30000] of longint;
 5   function max(x,y:longint):longint;
 6   begin if x>y then max:=x else max:=y; end;
 7 begin
 8   assign(input,‘happy.in‘); assign(output,‘happy.out‘);
 9   reset(input); rewrite(output);
10   readln(n,m);
11   for i:=1 to m do
12     begin
13       readln(v[i],p[i]);
14       p[i]:=p[i]*v[i];
15     end;
16   for i:=1 to m do
17     for j:=n downto v[i] do
18       dp[j]:=max(dp[j],dp[j-v[i]]+p[i]);
19   writeln(dp[n]);
20   close(input); close(output);
21 end.

参考程序2

4、装箱问题(box.pas)

AYYZOJ p1021

COGS p1089

我的思路:使剩余空间最小,则可以设每件物品的价值c[i]=每件物品的体积w[i] 。转化为0/1背包问题,最后输出V-dp[v]即可

 1 var
 2   v,n,i,j:longint;
 3   w,c:array[1..30] of longint;
 4   dp:array[0..20000] of longint;
 5 function max(x,y:longint):longint;
 6 begin
 7   if x>y then max:=x else max:=y;
 8 end;
 9 begin
10 assign(input,‘npack.in‘);
11 reset(input);
12 assign(output,‘npack.out‘);
13 rewrite(output);
14   readln(v);
15   readln(n);
16   for i:=1 to n do begin readln(w[i]); c[i]:=w[i]; end;
17    for i:=1 to n do
18     for j:=v downto w[i] do
19      dp[j]:=max(dp[j-w[i]]+c[i],dp[j]);
20    writeln(v-dp[v]);
21 close(input);
22 close(output);
23 end.

我的程序

另一种思路:{f[j]是布尔数组,表示前i件物品正好装满容积为j的箱子,最后从后往前扫描布尔数组f,找到最大值}

 1 var
 2  f:array [0..20000] of boolean;
 3  box:array [0..30] of integer;
 4  n,v,m,i,j:longint;
 5 begin
 6  readln(v);
 7  readln(n);
 8  for i:=1 to n do read(box[i]);
 9  for i:=0 to v do f[i]:=false;
10  f[0]:=true;
11  for i:=1 to n do
12    for j:=v downto box[i] do
13      if f[j-box[i]] then f[j]:=true;
14  for i:=v downto 0 do if f[i]=true then
15    begin
16       writeln(v-i);
17       halt;
18    end;
19 end.

老师给的程序

5、竞赛真理(truth.pas/c/cpp)

AYYZOJ p1493

 1 var
 2   n,t,i,j:longint;
 3   f:array[0..1080000] of longint;
 4   w1,t1,w2,t2:array[0..30] of longint;
 5 function max(a,b:longint):longint;
 6 begin
 7   if a>b then max:=a
 8    else max:=b;
 9 end;
10 begin
11   fillchar(f,sizeof(f),0);
12   readln(n,t);
13   for i:=1 to n do
14    readln(w1[i],t1[i],w2[i],t2[i]);
15   for i:=1 to n do
16    for j:=t downto 1 do
17    begin
18      if j>=t1[i] then
19       f[j]:=max(f[j-t1[i]]+w1[i],f[j]);
20      if j>=t2[i] then
21       f[j]:=max(f[j-t2[i]]+w2[i],f[j]);
22    end;
23   writeln(f[t]);
24 end.

我的程序

 1 var a,b:array[1..30,1..2] of longint;
 2     f:array[0..1080000] of longint;
 3     i,j,n,time:longint;
 4 begin
 5   readln(n,time);
 6   for i:=1 to n do
 7     read(a[i,1],b[i,1],a[i,2],b[i,2]);
 8   for i:=1 to n do
 9     for j:=time downto 1 do begin
10       if j>=b[i,1] then
11         if f[j]<f[j-b[i,1]]+a[i,1] then f[j]:=f[j-b[i,1]]+a[i,1];
12       if j>=b[i,2] then
13         if f[j]<f[j-b[i,2]]+a[i,2] then f[j]:=f[j-b[i,2]]+a[i,2];
14     end;
15   writeln(f[time]);
16 end.

老师给的程序

时间: 2024-10-12 07:41:44

动态规划练习题(1)的相关文章

动态规划练习题

RQNOJ 496 /* dp记录路径的问题 f[i][j]表示用前j个花瓶盛放前i朵花的最大值 */ #include<cstdio> #include<iostream> #include<cstring> #define N 110 #define INF 1000000000 using namespace std; int a[N][N],f[N][N],q[N],n,m; int main() { memset(f,-127/3,sizeof(f)); sc

动态规划练习题(2)

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(

动态规划练习题 汇率

题目描述 在以后的若干天里戴维将学习美元与德国马克的汇率.编写程序帮助戴维何时应买或卖马克或美元,使他从100美元开始,最后能获得最高可能的价值. 输入 输入文件的第一行是一个自然数N,1≤N≤100,表示戴维学习汇率的天数. 接下来的N行中每行是一个自然数A,1≤A≤1000.第i+1行的A表示预先知道的第i+1天的平均汇率,在这一天中,戴维既能用100美元买A马克也能用A马克购买100美元. 输出 输出文件的第一行也是唯一的一行应输出要求的钱数(单位为美元,保留两位小数). 注意:考虑到实数

转载:动态规划

来源:http://blog.sina.com.cn/s/blog_7727572f01011461.html 动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法.20世纪50年代初美国数学家R.E.Bellman等人在研究多阶段决策过程(multistep decision process)的优化问题时,提出了著名的最优化原理(principle of optimality),把多阶段过程转化为一系列单阶段问

练习题(3) -- 另类的动态规划问题

题目如下: 已知 1) 对于数字1  可以表达为 (1) 2) 对于数字2  可以表达为 (1,1)   (2) 解释 1 + 1 = 2 3)  对于数字3  可以表达为 (1,1,1)  (1, 2)  (2, 1)   (3) 1 + 1 + 1 = 3 1 + 2 = 3 2 + 1 = 3 求对于数字N  所有表达项 解法提示: 这是一道比较简单的动态规划问题 对于数字3如果我们把它的所有表达想这样书写 以1为开头的序列的后半部分的和是2 动态规划有两个要素,一个是备忘录,一个是递推公

《挑战程序设计竞赛》课后练习题解集——3.4 熟练掌握动态规划

<挑战程序设计竞赛>课后练习题解集——3.4 熟练掌握动态规划 状态压缩DP POJ 2441  有N头牛,M个槽,N,M≤20,每头牛只在指定的pi个槽里进食,不与其他牛共享槽.问有多少种分配方案. dp[i][S],当前第i头牛要进食,槽的使用状态为S 1 #include <cstdio> 2 #include <cstring> 3 #include <vector> 4 using namespace std; 5 6 int n, m; 7 in

练习题7:袋鼠过河(使用了动态规划求解)

题目描述 一只袋鼠要从河这边跳到河对岸,河很宽,但是河中间打了很多桩子,每隔一米就有一个,每个桩子上都有一个弹簧,袋鼠跳到弹簧上就可以跳的更远.每个弹簧力量不同,用一个数字代表它的力量,如果弹簧力量为5,就代表袋鼠下一跳最多能够跳5米,如果为0,就会陷进去无法继续跳跃.河流一共N米宽,袋鼠初始位置就在第一个弹簧上面,要跳到最后一个弹簧之后就算过河了,给定每个弹簧的力量,求袋鼠最少需要多少跳能够到达对岸.如果无法到达输出-1. 输入描述: 输入分两行,第一行是数组长度N (1 ≤ N ≤ 1000

动态规划 Dynamic Programming

March 26, 2013 作者:Hawstein 出处:http://hawstein.com/posts/dp-novice-to-advanced.html 声明:本文采用以下协议进行授权: 自由转载-非商用-非衍生-保持署名|Creative Commons BY-NC-ND 3.0 ,转载请注明作者及出处. 前言 本文翻译自TopCoder上的一篇文章: Dynamic Programming: From novice to advanced ,并非严格逐字逐句翻译,其中加入了自己的

几个python练习题

从python公众号里面看到了几道python的练习题,就拿来练练手,结果上手了发现自己还是特别水,不是很难的8道题,我只做出来5道,其中还3道题卡住了,边查边做的.原题链接在这里:http://python.jobbole.com/83641/ 1. 编写代码, 打印1-1亿之内的偶数 看完题目想都没想就直接写了一句: 1 print [i for i in xrange(1, 10**9) if i % 2 == 0]  开始跑结果.然后.死机了.重启时候反省了一下,嗯,的确是有点二,一下生