动态规划练习题(含答案)

合集下载

5动态规划演算法习题答案

5动态规划演算法习题答案

5动态规划演算法习题答案1.最大子段和问题:给定整数序列,求该序列形如的子段和的最大值:1)已知一个简单演算法如下:int maxsum(int n,int a,int}试分析该演算法的时间複杂性。

2) 试用分治演算法解最大子段和问题,并分析演算法的时间複杂性。

3)试说明最大子段和问题具有最优子结构性质,并设计一个动态规划演算法解最大子段和问题。

分析演算法的时间複杂度。

(提示:令)解:1)分析按照第一章,列出步数统计表,计算可得 2)分治演算法:将所给的序列a[1:n]分为两段 a [1:n/2]、a[n/2+1:n],分别求出这两段的最大子段和,则a[1:n]的最大子段和有三种可能:①a[1:n]的最大子段和与a[1:n/2]的最大子段和相同;②a[1:n]的最大子段和与a[n/2+1:n]的最大子段和相同;③a[1:n]的最大子段和为两部分的栏位和组成,即;intmaxsubsum ( int *a, int left , int right)int s2 =0;int right_sum =0;for ( int i = center +1; i sum)sum = b;j=i;end}return sum;}自行推导,答案:时间複杂度为o(n)。

2.动态规划演算法的时间複杂度为o(n)(双机排程问题)用两台处理机a和b处理个作业。

设第个作业交给机器a处理时所需要的时间是,若由机器b来处理,则所需要的时间是。

现在要求每个作业只能由一台机器处理,每台机器都不能同时处理两个作业。

设计一个动态规划演算法,使得这两台机器处理完这个作业的时间最短(从任何一台机器开工到最后一台机器停工的总的时间)。

以下面的例子说明你的演算法:解:(思路一)在完成前k个作业时,设机器a工作了x 时间,则机器b此时最小的工作时间是x的一个函式。

设f[k][x]表示完成前k个作业时,机器b最小的工作时间,则其中对应第k个作业由机器b来处理(完成k-1个作业时机器a工作时间仍是x,则b在k-1阶段用时为);而对应第k个作业由机器a处理(完成k-1个作业,机器a工作时间是x-a[k],而b完成k阶段与完成k-1阶段用时相同为)。

动态规划练习试题和解答

动态规划练习试题和解答

动态规划练习题[题1] 多米诺骨牌(DOMINO)问题描述:有一种多米诺骨牌是平面的,其正面被分成上下两部分,每一部分的表面或者为空,或者被标上1至6个点。

现有一行排列在桌面上:顶行骨牌的点数之和为6+1+1+1=9;底行骨牌点数之和为1+5+3+2=11。

顶行和底行的差值是2。

这个差值是两行点数之和的差的绝对值。

每个多米诺骨牌都可以上下倒置转换,即上部变为下部,下部变为上部。

现在的任务是,以最少的翻转次数,使得顶行和底行之间的差值最小。

对于上面这个例子,我们只需翻转最后一个骨牌,就可以使得顶行和底行的差值为0,所以例子的答案为1。

输入格式:文件的第一行是一个整数n(1〈=n〈=1000〉,表示有n个多米诺骨牌在桌面上排成一行。

接下来共有n行,每行包含两个整数a、b(0〈=a、b〈=6,中间用空格分开〉。

第I+1行的a、b分别表示第I个多米诺骨牌的上部与下部的点数(0表示空)。

输出格式:只有一个整数在文件的第一行。

这个整数表示翻动骨牌的最少次数,从而使得顶行和底行的差值最小。

[题2] Perform巡回演出题目描述:Flute市的Phlharmoniker乐团2000年准备到Harp市做一次大型演出,本着普及古典音乐的目的,乐团指挥L.Y.M准备在到达Harp市之前先在周围一些小城市作一段时间的巡回演出,此后的几天里,音乐家们将每天搭乘一个航班从一个城市飞到另一个城市,最后才到达目的地Harp市(乐团可多次在同一城市演出).由于航线的费用和班次每天都在变,城市和城市之间都有一份循环的航班表,每一时间,每一方向,航班表循环的周期都可能不同.现要求寻找一张花费费用最小的演出表.输入: 输入文件包括若干个场景.每个场景的描述由一对整数n(2<=n<=10)和k(1<=k<=1000)开始,音乐家们要在这n个城市作巡回演出,城市用1..n标号,其中1是起点Flute市,n是终点Harp市,接下来有n*(n-1)份航班表,一份航班表一行,描述每对城市之间的航线和价格,第一组n-1份航班表对应从城市1到其他城市(2,3,...n)的航班,接下的n-1行是从城市2到其他城市(1,3,4...n)的航班,如此下去.每份航班又一个整数d(1<=d<=30)开始,表示航班表循环的周期,接下来的d个非负整数表示1,2...d天对应的两个城市的航班的价格,价格为零表示那天两个城市之间没有航班.例如"3 75 0 80"表示第一天机票价格是75KOI,第二天没有航班,第三天的机票是80KOI,然后循环:第四天又是75KOI,第五天没有航班,如此循环.输入文件由n=k=0的场景结束.输出:对每个场景如果乐团可能从城市1出发,每天都要飞往另一个城市,最后(经过k天)抵达城市n,则输出这k个航班价格之和的最小值.如果不可能存在这样的巡回演出路线,输出0.样例输入: 样例输出:3 6 4602 130 150 03 75 0 807 120 110 0 100 110 120 04 60 70 60 503 0 135 1402 70 802 32 0 701 800 0[题3] 复制书稿(BOOKS)问题描述:假设有M本书(编号为1,2,…M),想将每本复制一份,M本书的页数可能不同(分别是P1,P2,…PM)。

动态规划试题

动态规划试题

动态规划试题动态规划装箱问题(01背包):有⼀个箱⼦容量为VV(正整数,0≤V≤20000),同时有n个物品(024 68 3 12 7 9 7输出:0f[j]=max(f[j],f[j-w[i]]+w[i]);f[j] 为:当总容量为j 时,不放第i 件物品,所能装的最⼤体积。

f[j-w[i]]+w[i] 为:当总容量为j 时,放了第i 件物品后,所能装的最⼤体积。

(即j减去第i 件物品体积的容量能装的最⼤体积+第i 件物品的体积。

w[i] 为第i 件物品体积)背包的种类:背包分为01背包,多重背包以及完全背包这三种基本模型,其他的背包问题都是从这3种背包中延申出来的。

完全背包的模板题⾯是这样的:设有n种物品,每种物品有⼀个重量及⼀个价值。

但每种物品的数量是⽆限的,同时有⼀个背包,最⼤载重量为M,今从n种物品中选取若⼲件(同⼀种物品可以⽆限选取),使其重量的和⼩于等于M,⽽价值的和为最⼤。

完全背包[⽆限量]的采摘药输⼊:70 371 10069 11 2输出:140每个数组在满⾜条件,可以遍历多次01背包实现代码:采药-传送门输⼊:70 371 10069 11 2输出:3每个数组遍历⼀遍题⽬描述⾦明今天很开⼼,家⾥购置的新房就要领钥匙了,新房⾥有⼀间他⾃⼰专⽤的很宽敞的房间。

更让他⾼兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N元钱就⾏”。

今天⼀早⾦明就开始做预算,但是他想买的东西太多了,肯定会超过妈妈限定的N元。

于是,他把每件物品规定了⼀个重要度,分为5等:⽤整数1-5表⽰,第5等最重要。

他还从因特⽹上查到了每件物品的价格(都是整数元)。

他希望在不超过N元(可以等于N 元)的前提下,使每件物品的价格与重要度的乘积的总和最⼤。

设第jj件物品的价格为v_[j],重要度为w_[j],共选中了k件物品,编号依次为j_1,j_2,…,j_k,则所求的总和为:w_[j_k]v[j1]×w[j1]+v[j2]×w[j2]+…+v[jk]×w[jk]。

动态规划习题

动态规划习题

动态规划专题分类视图数轴动规题: (1)较复杂得数轴动规 (4)线性动规 (7)区域动规: (14)未知得动规: (20)数轴动规题:题1、2001年普及组第4题--装箱问题【问题描述】有一个箱子容量为V(正整数,0≤V≤20000),同时有n个物品(0<n≤30),每个物品有一个体积(正整数)。

要求从n个物品中,任取若干个装入箱内,使箱子得剩余空间为最小。

【输入格式】输入文件box、in有若干行。

第一行:一个整数,表示箱子容量V;第二行:一个整数,表示物品个数n;接下来n行,分别表示这n个物品得各自体积。

【输出格式】输出文件box、out只有一行数据,该行只有一个数,表示最小得箱子剩余空间。

【输入样例】2468312797【输出样例】题2、1996年提高组第4题--砝码秤重 __数据加强版【问题描述】设有n种砝码,第k种砝码有C k个,每个重量均为W k,求:用这些砝码能秤出得不同重量得个数,但不包括一个砝码也不用得情况。

【输入格式】输入文件weight、in得第一行只有一个数n,表示不同得砝码得种类数、第2行至第n+1行,每行有两个整数、第k+1行得两个数分别表示第k种砝码得个数与重量、【输出格式】输出文件weight、out中只有一行数据:Total=N。

表示用这些砝码能秤出得不同重量数。

【输入样例】22 22 3【输出样例】Total=8【样例说明】重量2,3,4,5,6,7,8,10都能秤得【数据限制】对于100%得数据,砝码得种类n满足:1≤n≤100;对于30%得数据,砝码得总数量C满足:1≤C≤20;对于100%得数据,砝码得总数量C满足:1≤C≤100;对于所有得数据,砝码得总重量W满足:1≤W≤400000;题3、石子归并-szgb、pas【问题描述】有一堆石头质量分别为W1,W2,…,Wn、(Wi≤10000),将石头合并为两堆,使两堆质量得差最小。

【输入】输入文件szgb、in得第一行只有一个整数n(1≤n≤50),表示有n堆石子。

动态规划习题答案汇编

动态规划习题答案汇编

2.某公司有资金4百万元向A,B和C3个项目追加投资,各个项目可以有不同的投资额(百万元计),相应的效益如表所示。

问怎样分配资金,使总效益值最大?##表8-47解:设S1-A,B,C项目的总投资额,S2-B、C项目的总投资额S3-C项目的投资额;X k-k项目的投资额;(X1-A项目的投资额,X2-B项目的投资额,X3-C项目的投资额)W k(S k,X k)-对K项目投资X k后的收益:W k(S k,X k)=W k (X k)T k (S k,X k)-S k+1=S k-X kf k (S k)-当K至第3项目允许的投资额为S k时所能获得的最大收益。

为获得最大利润,必须将4百万全部投资,假设有4阶段存在,有S4=0,建立递归方程f4 (S k)=0f k (S k)=max{ W k (X k)+f k +1(S k+1)} k=3,2,1X k∈D k(S k)第一步,K=3f4(S4)=0f3 (S3)=max{W3 (X3)+f4 (S4)}X3∈D3(S3)S4=S3-X3第二步:K=2 f2 (S2)=max{W2 (X2)+f3 (S3)}X2∈D2(S2)S3=S2-X2W2 (X2)+f3 (S2-X2)第三步:K=1 f1 (S1) =max {W1 (X1)+ f2 (S2)}X1∈D1(S1)S2= S1- X1W1 (X1)+ f2 (S1- X1)S1=4 →S2=1 →S3=1↓↓↓X1*=3 X2*=0 X3*=1A投资3百万,B不投资C投资1百万。

总收益164百万元。

3.(最优分配问题)有一个仪表公司打算向它的3个营业区设立6家销售店。

每个营业区至少设一家,所获利润如表。

问设立的6家销售店数应如何分配,可使总利润最大?解:s k——对k#,…,3#营业区允许设立的销售店数x k——对k#营业区设立的销售店数w k (s k,x k)——对k#营业区设立x k销售店后的利润:w k (s k,,x k)= w k (x k)T k (s k, x k)——s k +1= s k - x kf k (s k)——当第k至第3个营业区允许设立的销售店数为s k 时所能获得的最大利润递归方程:f4(s4)=0f k (s k)=max {wk (xk)+ fk+1(sk+1)}, k=3,2,1 xk∈Dk(sk)k=3时,有方程f4 (s4)=0f3(s3)= max {w3(x3)+ f4(s4) }x3∈D3(s3)s3=s2—x2k=2,有方程f2(s2)= max {w2(x2)+ f3(s3) }x2∈D2(s2)s3=s2—x2k=1,有方程f1(s1)= max{w1(x1)+ f2(s2) } x1∈D1(s1) s2=s1—x1s1=6 → s2=3 → s3=2 ↓ ↓ ↓x1*=3 x2*=1 x3*=2分别A1、A2、A3营业区设立3家、1家、2家销售店,最大利润为7704.用动态规划方法求解下列模型:maxf=10X1+4X2+5X3s.t. 3X1+5 X2+4 X3≤150≤X1≤2 0≤X2≤2 X3≥0 ,X j为整数j=1,2,3解:收费C1=10 C2=4 C3=5X1为货物1的装载件数X2为货物2的装载件数X3为货物3的装载件数分3阶段S1为货物1、2、3允许的装载重量(3X1+5 X2+4 X3的允许值)S2为货物2、3允许装载的重量(5 X2+4 X3的允许值)S3 为货物3允许装载的重量(4 X3的允许值)第一步:K=3f4(S4)=0f3(S3)= max{5X3+ f4(S4)| X3∈D3(S3)}S4= S3 -4 X3第二步:K=2f2(S2)= max{4X2+ f3(S3)| X2∈D2(S2)} S3= S2 -5 X2划分点:第三步:K=1f1(S3)= max{10X1+ f2(S2)| X1∈D1(S1)}S2= S1-3 X110X1+ f2(S1-3 X1)顺序追踪:最优策略为S1=15 →S2=9 →S3=9↓↓↓X1*=2 X2*=0 X3*=2最优装载方案为:货物1装2件;货物2不装;货物3装2件装载收费为30元5.用动态规划方法解下列0—1背包问题:Max f =12x1+12x2+9x3+16x4+30x5;s.t. 3x1+4x2+3x3+4x4+6x5≤12;x j=0,1, j=1,……,5解:本问题分为5个阶段。

运筹学 动态规划-作业及答案

运筹学 动态规划-作业及答案

1
第五章 动态规划作业题及答案
1.用动态规划法求解求最短路径
从起点A 到终点E 之间各点的距离如图所示。

求A 到E 的最短路径。

B A
C B
D B C D E
C 21
23
12
31
2
5
11214
10610
41312113
96
5810
5
2
2.用动态规划法求解资源分配问题
有资金4万元,投资A 、B 、C 三个项目,每个项目的投资效益与投入该项目的资金有关。

三个项目A 、B 、C 的投资效益(万吨)和投入资金(万元)的关系见下表:
用动态规划法求解对三个项目的最优投资分配,使总投资效益最大。

3.用动态规划法求解生产库存问题
一个工厂生产某种产品,1~7月份生产成本和产品需求量的变化情况如下表:
为了调节生产生产和需求,工厂设有一个产品仓库,库容量H=9。

已知期初库存量为2,要求期末(七月低)库存量为0。

每个月生产的产品在月末入库,月初根据当月需求发货。

求七个月的生产量,能满足各月的需求,并使生产成本最低。

4.用动态规划法求解背包问题
第i 种每件价值c 1=65,c 2=85,c 3=40元; 第i 种物品每件重量为:w 1=2,w 2=3,w 3=1公斤;现有一只可装载重量为5公斤的背包,求各种物品应各取多少件放入背包,使背包中物品的价值最高。

动态规划习题答案

动态规划习题答案

2.某公司有资金4百万元向A,B和C3个项目追加投资,各个项目可以有不同的投资额(百万元计),相应的效益如表所示。

问怎样分配资金,使总效益值最大?##表8-47W k (X k)投资额(项目k#012341#(A)-414860662#(B )40425060-3#(C)-64687884解:设S1-A,B,C项目的总投资额,S2-B、C项目的总投资额S3-C项目的投资额;X k-k项目的投资额;(X1-A项目的投资额,X2-B项目的投资额,X3-C项目的投资额)W k(S k,X k)-对K项目投资X k后的收益:W k(S k,X k)=W k (X k)T k (S k,X k)-S k+1=S k-X kf k (S k)-当K至第3项目允许的投资额为S k时所能获得的最大收益。

为获得最大利润,必须将4百万全部投资,假设有4阶段存在,有S4=0,建立递归方程f4 (S k)=0f k (S k)=max{ W k (X k)+f k +1(S k+1)} k=3,2,1X k∈D k(S k)第一步,K=3f4(S4)=0f3 (S3)=max{W3 (X3)+f4 (S4)}X3∈D3(S3)S4=S3-X3S3f3 (S3)X3* 1641268237834844第二步:K=2 f2 (S2)=max{W2 (X2)+f3 (S3)}X2∈D2(S2)S3=S2-X2W2 (X2)+f3 (S2-X2)S2X2 =0X2 =1X2 =2X2 =3f2 (S2)X2 * 140+64---1040 240+6842+64--1080 340+7842+6850+64-1180 440+8442+7850+6860+641240,3第三步:K=1 f1 (S1) =max {W1 (X1)+ f2 (S2)}X1∈D1(S1)S2= S1- X1W1 (X1)+ f2 (S1- X1)S1X1=0X1=1X1=2X1=3f1 (S1)X1 * 4-41+118 48+10860+1041643S1=4 →S2=1 →S3=1↓↓↓X1*=3 X2*=0 X3*=1A投资3百万,B不投资C投资1百万。

动态规划专项练习(1)

动态规划专项练习(1)

动态规划专项练习(1)动态规划专项练习(1)1、警卫安排(security.pas/c/cpp)一个重要的基地被分为n个连通的区域。

出于某种神秘的原因,这些区域以一个区域为核心,呈一颗树形分布。

在每个区域安排警卫所需要的费用是不同的,而每个区域的警卫都可以望见其相邻的区域,只要一个区域被一个警卫望见或者是安排有警卫,这个区域就是安全的。

你的任务是:在确保所有区域都是安全的情况下,找到安排警卫的最小费用。

输入数据第一行n,表示树中结点的数目。

接下来的n行描述了n个区域的信息,每一行包含的整数依次为:区域的标号i(0<i<=n),在区域i安排警卫的费用k,区域i的子结点数目m,接下来m个数为区域i p="" 的子结点编号。

<=""> 输出数据一行一个整数,为最小的安排费用。

样例输入:security.in61 30 323 42 16 2 5 63 5 04 4 05 11 06 5 0输出security.out25数据范围对于所有的数据,0<n<=720。

< p="">2、最长上升子序列(LIS.pas/c/cpp)LIS问题是最经典的动态规划基础问题之一。

如果要求一个满足一定条件的最长上升子序列,你还能解决吗?给出一个长度为N整数序列,请求出它的包含第K个元素的最长上升子序列。

例如:对于长度为6的序列<2,7,3,4,8,5>,它的最长上升子序列为<2,3,4,5>,但如果限制一定要包含第2个元素,那么满足此要求的最长上升子序列就只能是<2,7,8>了。

输入数据第一行为两个整数N,K,如上所述。

接下来是N个整数,描述一个序列。

输出数据请输出一个整数,即包含第K个元素的最长上升子序列长度。

样例输入8 665 158 170 299 300 155 207 389输出4数据范围对于所有的数据,满足0<n<=200000,0<k<=n< p="">3、最短回文串(palindrome.pas/c/cpp)如果一个字符串正过来读和倒过来读是一样的,那么这个字符串就被称作回文串。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

动态规划练习题USACO 2.2 Subset Sums题目如下:对于从1到N的连续整集合合,能划分成两个子集合,且保证每个集合的数字和是相等的。

举个例子,如果N=3,对于{1,2,3}能划分成两个子集合,他们每个的所有数字和是相等的:and {1,2}这是唯一一种分发(交换集合位置被认为是同一种划分方案,因此不会增加划分方案总数)如果N=7,有四种方法能划分集合{1,2,3,4,5,6,7},每一种分发的子集合各数字和是相等的:{1,6,7} and {2,3,4,5} {注1+6+7=2+3+4+5}{2,5,7} and {1,3,4,6}{3,4,7} and {1,2,5,6}{1,2,4,7} and {3,5,6}给出N,你的程序应该输出划分方案总数,如果不存在这样的划分方案,则输出0。

程序不能预存结果直接输出。

PROGRAM NAME: subsetINPUT FORMAT输入文件只有一行,且只有一个整数NSAMPLE INPUT (file subset.in)7OUTPUT FORMAT输出划分方案总数,如果不存在则输出0。

SAMPLE OUTPUT (file subset.out)4参考程序如下:#include <fstream>using namespace std;const unsigned int MAX_SUM = 1024;int n;unsigned long long int dyn[MAX_SUM];ifstream fin ("subset.in");ofstream fout ("subset.out");int main() {fin >> n;fin.close();int s = n*(n+1);if (s % 4) {fout << 0 << endl;fout.close ();return ;}s /= 4;int i, j;dyn [0] = 1;for (i = 1; i <= n; i++)for (j = s; j >= i; j--)dyn[j] += dyn[j-i];fout << (dyn[s]/2) << endl;fout.close();return 0;}USACO 2.3 Longest Prefix题目如下:在生物学中,一些生物的结构是用包含其要素的大写字母序列来表示的。

生物学家对于把长的序列分解成较短的(称之为元素的)序列很感兴趣。

如果一个集合P 中的元素可以通过串联(允许重复;串联,相当于Pascal 中的“+” 运算符)组成一个序列S ,那么我们认为序列S 可以分解为P 中的元素。

并不是所有的元素都必须出现。

举个例子,序列ABABACABAAB 可以分解为下面集合中的元素:{A, AB, BA, CA, BBC}序列S 的前面K 个字符称作S 中长度为K 的前缀。

设计一个程序,输入一个元素集合以及一个大写字母序列,计算这个序列最长的前缀的长度。

PROGRAM NAME: prefixINPUT FORMAT输入数据的开头包括1..200 个元素(长度为 1..10 )组成的集合,用连续的以空格分开的字符串表示。

字母全部是大写,数据可能不止一行。

元素集合结束的标志是一个只包含一个“.” 的行。

集合中的元素没有重复。

接着是大写字母序列S ,长度为1..200,000 ,用一行或者多行的字符串来表示,每行不超过76 个字符。

换行符并不是序列S 的一部分。

SAMPLE INPUT (file prefix.in)A AB BA CA BBC.ABABACABAABCOUTPUT FORMAT只有一行,输出一个整数,表示S 能够分解成P 中元素的最长前缀的长度。

SAMPLE OUTPUT (file prefix.out)11示例程序如下:#include <stdio.h>#define MAXP 200#define MAXL 10char prim[MAXP+1][MAXL+1];int nump;int start[200001];char data[200000];int ndata;int main(int argc, char **argv){FILE *fout, *fin;int best;int lv, lv2, lv3;if ((fin = fopen("prim.in", "r")) == NULL){perror ("fopen fin");exit(1);}if ((fout = fopen("prim.out", "w")) == NULL){perror ("fopen fout");exit(1);}while (1){fscanf (fin, "%s", prim[nump]);if (prim[nump][0] != '.') nump++;else break;}ndata = 0;while (fscanf (fin, "%s", data+ndata) == 1)ndata += strlen(data+ndata);start[0] = 1;best = 0;for (lv = 0; lv < ndata; lv++)if (start[lv]){best = lv;for (lv2 = 0; lv2 < nump; lv2++){for (lv3 = 0; lv + lv3 < ndata && prim[lv2][lv3] && prim[lv2][lv3] == data[lv+lv3]; lv3++)if (!prim[lv2][lv3])start[lv + lv3] = 1;}}if (start[ndata]) best = ndata;fprintf (fout, "%i\n", best);return 0;}USACO 3.1 Score Inflation题目如下:我们试着设计我们的竞赛以便人们能尽可能的多得分,这需要你的帮助。

我们可以从几个种类中选取竞赛的题目,这里的一个"种类"是指一个竞赛题目的集合,解决集合中的题目需要相同多的时间并且能得到相同的分数。

你的任务是写一个程序来告诉USACO的职员,应该从每一个种类中选取多少题目,使得解决题目的总耗时在竞赛规定的时间里并且总分最大。

输入包括竞赛的时间,M(1 <= M <= 10,000)和N,"种类"的数目1 <= N <= 10,000。

后面的每一行将包括两个整数来描述一个"种类":第一个整数说明解决这种题目能得的分数(1 <= points <= 10000),第二整数说明解决这种题目所需的时间(1 <= minutes <= 10000)。

你的程序应该确定我们应该从每个"种类"中选多少道题目使得能在竞赛的时间中得到最大的分数。

来自任意的"种类"的题目数目可能任何非负数(0或更多)。

计算可能得到的最大分数。

PROGRAM NAME: inflateINPUT FORMAT第 1 行: M, N--竞赛的时间和题目"种类"的数目。

第2-N+1 行: 两个整数:每个"种类"题目的分数和耗时。

SAMPLE INPUT (file inflate.in)300 4100 60250 120120 10035 20OUTPUT FORMAT单独的一行包括那个在给定的限制里可能得到的最大的分数。

SAMPLE OUTPUT (file inflate.out)605{从第2个"种类"中选两题,第4个"种类"中选三题}示例程序如下:#include <fstream.h>ifstream fin("inflate.in");ofstream fout("inflate.out");const short maxm = 10010;long best[maxm], m, n;voidmain(){short i, j, len, pts;fin >> m >> n;for (j = 0; j <= m; j++)best[j] = 0;for (i = 0; i < n; i++) {fin >> pts >> len;for (j = len; j <= m; j++)if (best[j-len] + pts > best[j])best[j] = best[j-len] + pts;}fout << best[m] << endl; // 由于数组元素不减,末元素最大}USACO 3.3 A Game题目如下:有如下一个双人游戏:N(2 <= N <= 100)个正整数的序列放在一个游戏平台上,两人轮流从序列的两端取数,取数后该数字被去掉并累加到本玩家的得分中,当数取尽时,游戏结束。

以最终得分多者为胜。

编一个执行最优策略的程序,最优策略就是使自己能得到在当前情况下最大的可能的总分的策略。

你的程序要始终为第二位玩家执行最优策略。

PROGRAM NAME: game1INPUT FORMAT第一行: 正整数N, 表示序列中正整数的个数。

第二行至末尾: 用空格分隔的N个正整数(大小为1-200)。

SAMPLE INPUT (file game1.in)64 7 2 95 2OUTPUT FORMAT只有一行,用空格分隔的两个整数: 依次为玩家一和玩家二最终的得分。

SAMPLE OUTPUT (file game1.out)18 11参考程序如下:#include <stdio.h>#define NMAX 101int best[NMAX][2], t[NMAX];int n;voidreadx () {int i, aux;freopen ("game1.in", "r", stdin);scanf ("%d", &n);for (i = 1; i <= n; i++) {scanf ("%d", &aux);t = t[i - 1] + aux;}fclose (stdin);}inline intmin (int x, int y) {return x > y ? y : x;}voidsolve () {int i, l;for (l = 1; l <= n; l++)for (i = 1; i + l <= n + 1; i++)best[l%2] = t[i + l - 1] - t[i - 1] - min (best[i + 1][(l - 1) % 2],best[(l - 1) % 2]);}void writex () {freopen ("game1.out", "w", stdout);printf ("%d %d\n", best[1][n % 2], t[n] - best[1][n % 2]);fclose (stdout);}intmain () {readx ();solve ();writex ();return 0;}USACO 3.4 Raucous Rockers题目如下:你刚刚得到了流行的“破锣摇滚”乐队录制的尚未发表的N(1 <= N <= 20)首歌的版权。

相关文档
最新文档