找零钱问题

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

求π 的近似值
• 正方形面积 正方形面积S=1 ¼圆面积 = π/4 圆面积C= 圆面积 • 设雨点落入
– 整个容器中的数目为 整个容器中的数目为A – ¼扇形容器中的数目为 扇形容器中的数目为B 扇形容器中的数目为
• 当雨点数足够多时,有 当雨点数足够多时,
A S 1 4 = = = B C π /4 π
// 划分 int Partition(int *a, int p, int q) { int i=p; int j=q+1; int x=a[p]; while(true) { while(a[++i]<x); while(a[--j]>x); if(i>=j) break; Swap(a[i], a[j]); } a[p]=a[j]; a[j]=x; return j; }
上机练习
有一艘货船准备用来装载货物。 有一艘货船准备用来装载货物。所有待装的货物都装在集装箱中且所 有集装箱的大小都一样,但集装箱的重量都各不相同。 有集装箱的大小都一样,但集装箱的重量都各不相同。 设第i 个集装箱的重量为wi(1≤i≤n),而货船的最大载重量为c 设第 ),而货船的最大载重量为 ),而货船的最大载重量为 如何能够在货船上装入最多的集装箱? 如何能够在货船上装入最多的集装箱? 设用xi=1表示集装箱 装入轮船,xi=0表示集装箱 不装入轮船。 表示集装箱i装入轮船 表示集装箱i不装入轮船 设用 表示集装箱 装入轮船, 表示集装箱 不装入轮船。
请在上机结束前将源程序交到Ftp://202.117.35.169/C++/zhudj/Algorithm目 请在上机结束前将源程序交到 上机结束前 交到 目 录中,文件名为学号即可 不分班级。 为学号即可, 录中,文件名为学号即可,不分班级。
上机选做题
下左图中有两条半径为1的圆弧,请用随机法求阴影图形面积, 下左图中有两条半径为 的圆弧,请用随机法求阴影图形面积,同 的圆弧 时请用几何法验算比较(几何法提示见下右图)。 时请用几何法验算比较(几何法提示见下右图)。
请编写一个程序, 请编写一个程序,输入的是要找给顾客的零钱 (以分为单位),输出的是应该找回的各种硬币 以分为单位),输出的是应该找回的各种硬币 ), 数目,并保证找回的硬币数最少。 数目,并保证找回的硬币数最少。
#include <iostream.h> int main() { int change; cout<<"请输入要找给顾客的零钱(以分为单位)"; 请输入要找给顾客的零钱( 请输入要找给顾客的零钱 以分为单位) cin>>change; cout<<"找给顾客的五角硬币个数为:"<<change/50<<endl; 找给顾客的五角硬币个数为: 找给顾客的五角硬币个数为 change=change%50; cout<<"找给顾客的壹角硬币个数为:"<<change/10<<endl; 找给顾客的壹角硬币个数为: 找给顾客的壹角硬币个数为 change=change%10; cout<<"找给顾客的伍分硬币个数为:"<<change/5<<endl; 找给顾客的伍分硬币个数为: 找给顾客的伍分硬币个数为 change=change%5; cout<<"找给顾客的贰分硬币个数为:"<<change/2<<endl; 找给顾客的贰分硬币个数为: 找给顾客的贰分硬币个数为 change=change%2; cout<<"找给顾客的壹分硬币个数为:"<<change<<endl; 找给顾客的壹分硬币个数为: 找给顾客的壹分硬币个数为 return 0; }
1, 4,8,11
Divide and Conquer
找出伪币
• 假定有16枚硬币,其中包含一个是伪造的硬币, 假定有16枚硬币,其中包含一个是伪造的硬币, 16枚硬币 这枚伪币比真币要轻一些。要求找出这个伪造的 这枚伪币比真币要轻一些。 硬币。 硬币。 • 为了帮助你完成这一任务,将提供一台可用来比 为了帮助你完成这一任务, 较两组硬币重量的仪器,利用这台仪器, 较两组硬币重量的仪器,利用这台仪器,可以知 道两组硬币的重量是否相同。 道两组硬币的重量是否相同。
• 各活动的起始时间和结束时间存储于数组 和f中且按结束时间 各活动的起始时间和结束时间存储于数组s和 中且按结束时间 的非减序: 排列。 的非减序:f1≤f2≤…≤fn排列。如果所给出的活动未按此序排列, 排列 如果所给出的活动未按此序排列, 需重排。 需重排。 template< class type> void greedyselector(int n, type s[ ], type f[ ], bool a[ ] ) { a[ 1 ] = true; int j = 1; for (int i=2;i< =n;i+ + ) { if (s[i]>=f[j]) { a[i] = true; j=i; } else a[i]= false; } } • 该算法的贪心选择的意义是使剩余的可安排时间段极大化, 该算法的贪心选择的意义是使剩余的可安排时间段极大化, 以便安排尽可能多的相容活动。 以便安排尽可能多的相容活动。
找伪币算法
• 算法1:两两比较 算法1
–最多通过8次比较来判断伪币的存在并找出这一伪币。 最多通过8次比较来判断伪币的存在并找出这一伪币。 最多通过
• 算法2:利用分治法 算法2
–16枚硬币的问题就被分为两个8枚硬币(A组和B组)的 16枚硬币的问题就被分为两个8枚硬币( 16枚硬币的问题就被分为两个 问题。通过比较这两组硬币的重量, 问题。通过比较这两组硬币的重量,可以判断伪币是 否存在。如果没有伪币,则算法终止。否则, 否存在。如果没有伪币,则算法终止。否则,继续在 较轻的那组硬币来寻找伪币。 较轻的那组硬币来寻找伪币。直到最后的那个组里只 有两个硬币。比较该组中两个硬币的重量, 有两个硬币。比较该组中两个硬币的重量,可以立即 找到伪币。 找到伪币。 –最多需要4次即能找到伪币 最多需要 最多需要4
• 即
π = 4∗ B/ A
求π 的近似值
• 下雨时: 下雨时:
– 雨点落在整个正方形容器中的限制条件是: 雨点落在整Hale Waihona Puke Baidu正方形容器中的限制条件是:
0 ≤ x ≤1 0 ≤ y ≤1
– 雨点落在扇形区域中的限制条件是: 雨点落在扇形区域中的限制条件是:
x2 + y 2 ≤ 1
int main() { int a=0, b=0; double pi, x, y; srand((unsigned int)time(NULL)); for(int i=0; i<10000; i++) { a++; x=(double)rand()/RAND_MAX; y=(double)rand()/RAND_MAX; if(sqrt(x*x+y*y)<=1)b++; } pi=4.0*(double)b/a; cout<<"pi="<<pi<<endl; return 0; }
活动安排问题
设有n个活动的集合e={1,2,…,n},其中每个活动都要求 使用同一资源,如演讲会场等,而在同一时间内只有一 个活动能使用这一资源。每个活动i都有一个要求使用该 资源的起始时间si和一个结束时间fi,且si<fi。 如果选择了活动i,则它在时间区间[si,fi]内占用资源。若区 间[si,fi]与区间[sj,fj]不相交,则称活动i与活动j是相 [si fi] [sj fj] i j 容的。也就是说,当si≥fi或sj≥fj时,活动i与活动j相容。 活动安排问题就是要在所给的活动集合中选出最大的相 容活动子集合。
输入: 第一行输入n和 , 第二行输入n个集装箱的重量序列 个集装箱的重量序列, 输入: 第一行输入 和c,它们之间以空格隔开 ,第二行输入 个集装箱的重量序列, 各个数之间以空格隔开 输出: 序列, 输出: xi序列,各个数之间以空格隔开
例如当n =8, c= 400, [w1 , ... w8 ]=[100,200,50,90,150,50,20,80] 时,输出应该为 [x1 , ..., x8 ] = [ 1 0 1 1 0 1 1 1 ]
Algorithm Design Techniques
Greedy Algorithms Divide and Conquer Dynamic Programming Backtracking Algorithms Randomized Algorithms

Greedy Algorithms
找零钱问题
假定有伍角、壹角、伍分、 假定有伍角、壹角、伍分、贰分和壹分共五种硬 在给顾客找硬币时, 币,在给顾客找硬币时,一般都会尽可能的选用 硬币个数最小的方法。例如, 硬币个数最小的方法。例如,当要给某顾客找七 角二分钱时,会给他一个伍角, 个壹角和1 角二分钱时,会给他一个伍角,2个壹角和1个贰 分的硬币。 分的硬币。
Quicksort
// 快速排序 void QuickSort(int *a, int p, int q) { if(p<q) { int r=Partition(a, p, q); QuickSort(a, p, r-1); //对左半段排序 对左半段排序 QuickSort(a, r+1, q); //对右半段排序 对右半段排序 } }
Randomized Algorithms
Quicksort
Recursion depth of Quicksort: a) best case, b) average case, c) worst case
// 随机划分 int RandomizedPartition(int *a, int p, int q) { int i=Random(p, q); Swap(a[i], a[p]); return Partition(a, p, q); } // 排序 void RandomizedQuickSort(int *a, int p, int q) { if(p<q) { int r=RandomizedPartition(a, p, q); RandomizedQuickSort(a, p, r-1); //对左半段排序 对左半段排序 RandomizedQuickSort(a, r+1, q); //对右半段排序 对右半段排序 } }
结 束 语
学好程序设计语言的唯一途径是 上机练习
你的编程能力与你在计算机上 投入的时间成正 比
A 30° ° B
A
30° °
如果你选做了本题并取得了正确答案,请在上机结束前将源程序交到 如果你选做了本题并取得了正确答案,请在上机结束前将源程序交到 上机结束前 Ftp://202.117.35.169/C++/zhudj/Algorithm目录中,文件名为学号 ,不分班级。 目录中, 为学号_M,不分班级。 目录中 文件名为学号
相关文档
最新文档