实验动态规划(报告).pdfVIP

  • 16
  • 0
  • 约8.99千字
  • 约 10页
  • 2021-03-25 发布于天津
  • 举报
实验 3 动态规划 一、实验目的 1)熟练掌握动态规划思想及教材中相关经典算法。 2 )掌握用动态规划解题的基本步骤,能够用动态规划解决一些问题。 二、实验内容 1)选定实验题目,仔细阅读实验要求,设计好输入输出,按照动态规划方法的 思想构思算法,选取合适的存储结构实现应用的操作。 2 )设计的结果在 Visual C++ 实验环境下实现并进行调试。 3 )实验要有详细的测试记录,包括各种可能的测试数据。 三、实验问题 (1)找零钱问题 问题描述 设有 n 种不同面值的硬币,各硬币的面值存于数组 T[1:n] 中。现要用 这些面值的硬币来找钱,可以实用的各种面值的硬币个数不限。当只用 硬币面值 T[1],T[2], …,T[i] 时,可找出钱数 j 的最少硬币个数记为 C(i,j) 。若只用这些硬币面值,找不出钱数 j 时,记 C(i,j)= ∞。 编程任务 设计一个动态规划算法,对 1≤j ≤L,计算出所有的 C( n,j ) 。算法中 只允许实用一个长度为 L 的数组。用 L 和 n 作为变量来表示算法的计算 时间复杂性 数据输入 由文件 input.txt 提供输入数据。文件的第 1 行中有 1 个正整数 n (n=13),表示有 n 种硬币可选。接下来的一行是每种硬币的面值。 由用户输入待找钱数 j 。 结果输出 程序运行结束时,将计算出的所需最少硬币个数输出到文件 output.txt 中。 输入文件示例 输出文件示例 input.txt output.txt 3 3 12 5 9 复杂性: 需要另外的 n 1 的空间存放暂时结果,空间复杂行为: L n 1 n 变量: int n // 零钱面值数目 int *price //存放零钱面值数组,下标表示第几种币值,数组内为币值价值 int *ret //存放存放临时结果数组,下标表示第几种币值,其值为对应个数 int sum // 所需币值总数 函数: int change(int total, int array[],int begin,int end) // 找零钱递归函数,包含要找的零钱总值,零钱面值数组,指向最大面值的指 针,指向最小面值的指针,当找到所需最少硬币数返回 1,找不到返回 0 流程: 完整实验程序 #include stdio.h #include stdlib.h #includefstream.h int *price 。 int *ret 。 int change(int total, int array[],int begin,int end) { if(total == array[begin])// 最大的面值就是要找的零钱总值,所需零钱数 +1 ret[begin]++ 。 else{ while(beginend) //在币值范围内从大找到小 { if(totalarray[begin]){// 要找的零钱总值比最大的面值大 ret[begin]++ 。 // 先设定可以有一张最大面值的零钱 if (change(total-array[begin],array,

文档评论(0)

1亿VIP精品文档

相关文档