动态规划练习题(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(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.

老师给的程序(含思路)

时间: 2024-08-04 19:15:58

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

动态规划练习题

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

动态规划练习题 汇率

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

动态规划练习题(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 m

转载:动态规划

来源: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]  开始跑结果.然后.死机了.重启时候反省了一下,嗯,的确是有点二,一下生