c语言拔河分组回溯算法,[2018年最新整理]noip_pascal语言_动态规划.ppt

[2018年最新整理]noip_pascal语言_动态规划

第九章 动态规划 第一节 动态规划的基本模型 多阶段决策过程的最优化问题 动态规划的基本概念和基本模型构成 最优化原理与无后效性 动态规划设计方法的一般模式 第二节 动态规划与递推 ——动态规划是最优化算法 第三节 历届NOIP动态规划试题 第四节 背包问题 【上机练习】 第五节 动态规划应用举例 【输出格式】 答案输出到当前目录下的文本文件“CATCHER.OUT”中,该文件第一行是一个整数max,表示最多能截击的进攻导弹数,以下的max行每行各有一个整数,表示各个被截击的进攻导弹的编号(按被截击的先后顺序排列)。输出的答案可能不唯一,只要输出其中任一解即可。 【输入输出样例】 ? ? 23 3 ? 36 1 ? 25 2 ? 3 输出文件:CATCHER.OUT ? 输入文件:CATCHER.IN 【算法分析】 归根结底就是求一整串数中的最长不上升序列,用2个一维数组b[1..max]和c[1..max]来建立动态规划状态转移方程(注: b[1..max]表示当前状态最多可击落的导弹数,c[1..max]表示当前状态的后继标志):b[i]=Max{b[j]+1,(j=i+1..n)},然后程序也就不难实现了。 【参考程序】 program catcher; var a,b,c:array[1..10000] of longint; i,j,k,n,max:longint; begin assign(input,'catcher.in'); reset(input); assign(output,'catcher.out');rewrite(output); fillchar(c,sizeof(c),0); read(n); for i:=1 to n do begin read(a[i]); b[i]:=1;end; for i:=n-1 downto 1 do begin k:=0; for j:=i+1 to n do if (a[i]>=a[j])and (b[j]+1>b[i]) then begin b[i]:=b[j]+1;k:=j; end; c[i]:=k; end; max:=0;k:=0; 本程序段也可如下: for i:=n-1 downto 1 do begin max:=0; k:=0; for j:=i+1 to n do if (a[i]>=a[j]) and (b[j]>max) then begin max:=b[j]; k:=j; end; b[i]:=max+1; c[i]:=k; end; for i:=1 to n do //计算最多能截击的进攻导弹数 if b[i]>max then begin max:=b[i]; k:=i; end; writeln(max); //输出最多能截击的进攻导弹数 writeln(k); while c[k]<>0 do //输出各个被截击的进攻导弹的编号 begin k:=c[k];writeln(k); end; close(input);close(output); end. 【例2】拔河比赛(tug.pas) 【问题描述】 一个学校举行拔河比赛,所有的人被分成了两组,每个人必须(且只能够)在其中的一组,要求两个组的人数相差不能超过1,且两个组内的所有人体重加起来尽可能地接近。 【输入格式】 输入数据的第1行是一个n,表示参加拔河比赛的总人数,n<=100,接下来的n行表示第1到第n个人的体重,每个人的体重都是整数(1<=weight<=450)。 【输出格式】 输出数据应该包含两个整数:分别是两个组的所有人的体重和,用一个空格隔开。注意如果这两个数不相等,则请把小的放在前面输出。 【输入样例】tug.in 3 100 90 200 【输出样例】tug.out 190 200 【算法分析】 这道题目不满足动态规划最优子结构的特性。因为最优子结构要求一个问题的最优解只取决于其子问题的最优解。就这道题目而言

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值