排队购票问题分析与解决
2017-03-09 22:07
323 查看
问题描述:
售票工作正在进行,每张票为50元,现在有m+n人排队等待购票,其中有m人手持50元,n人手持100元,假设售票处不设找零,那么若想使售票处不会出现找不开零钱的局面,请你帮忙设计不同的排队方案。特别说明的是,拿同样面值的人对换位置为同一种方案。
算法分析:
一:n=0; 那么说明买票的人都是手持50元,所以不会出现找不开零钱的局面,所以这是一种排队方案;
二:m=0; 那么说明买票的人都是手持100元,所以一定会找不开零钱,所以没有排队方案;
三:m<n; 那么说明买票的人中,手持50元的人数少于手持100元的人数,所以肯定会出现找不开零钱的局面,所以同样没有排队方案;
四:m>n; 此时,买票的人中,手持50元的人数多于手持100元的人数,所以可以有排队方案,我们这里来分析一下第m+n人的位置:
(1):第(m+n)人手持100元站在第(m+n-1)人的后面,那么他之前的人有(m)人手持50元,有(n-1)人手持100元,此种情况共有f(m,n-1)种排队方式;
[b] (1):第(m+n)人手持50元站在第(m+n-1)人的后面,那么他之前的人有(m-1)人手持50元,有(n)人手持100元,此种情况共有f(m-1,n)种排队方式;[/b]
[b]所以通过第(m+n)人就可以分析出递归关系为:f(m,n)=f(m-1,n)+f(m,n-1)[/b]
[b]刚刚分析的边界条件: 当m<n时,f(m,n)=0; 当n=0时,f(m,n)=1; 当 m=0时,f(m,n)=0;[/b]
[b]代码如下:[/b]
[b]递归方法:[/b]
#include<iostream>
using namespace std;
long f(int i,int j){
long s;
if(j==0){
s=1;
}
else if(i<j){
s=0;
}
else{
s=f(i-1,j)+f(i,j-1);
}
return (s);
}
int main(){
int m,n;
cout<<"请输入m,n:";
cin>>m>>n;
cout<<f(m,n);
}
[b]
[/b]
[b]递推方法:[/b]
#include<iostream>
using namespace std;
int main(){
int i,j,m,n;
long f[100][100];
cout<<"请输入m,n:";
cin>>m>>n;
for(i=1;i<=m;i++){
f[i][0]=1;
}
for(i=0;i<=m;i++){
for(j=i+1;j<=n;j++){
f[i][j]=0;
}
}
for(j=1;j<=n;j++){
for(i=j;i<=m;i++){
f[i][j]=f[i-1][j]+f[i][j-1];
}
}
cout<<f[m]
<<endl;
}
售票工作正在进行,每张票为50元,现在有m+n人排队等待购票,其中有m人手持50元,n人手持100元,假设售票处不设找零,那么若想使售票处不会出现找不开零钱的局面,请你帮忙设计不同的排队方案。特别说明的是,拿同样面值的人对换位置为同一种方案。
算法分析:
一:n=0; 那么说明买票的人都是手持50元,所以不会出现找不开零钱的局面,所以这是一种排队方案;
二:m=0; 那么说明买票的人都是手持100元,所以一定会找不开零钱,所以没有排队方案;
三:m<n; 那么说明买票的人中,手持50元的人数少于手持100元的人数,所以肯定会出现找不开零钱的局面,所以同样没有排队方案;
四:m>n; 此时,买票的人中,手持50元的人数多于手持100元的人数,所以可以有排队方案,我们这里来分析一下第m+n人的位置:
(1):第(m+n)人手持100元站在第(m+n-1)人的后面,那么他之前的人有(m)人手持50元,有(n-1)人手持100元,此种情况共有f(m,n-1)种排队方式;
[b] (1):第(m+n)人手持50元站在第(m+n-1)人的后面,那么他之前的人有(m-1)人手持50元,有(n)人手持100元,此种情况共有f(m-1,n)种排队方式;[/b]
[b]所以通过第(m+n)人就可以分析出递归关系为:f(m,n)=f(m-1,n)+f(m,n-1)[/b]
[b]刚刚分析的边界条件: 当m<n时,f(m,n)=0; 当n=0时,f(m,n)=1; 当 m=0时,f(m,n)=0;[/b]
[b]代码如下:[/b]
[b]递归方法:[/b]
#include<iostream>
using namespace std;
long f(int i,int j){
long s;
if(j==0){
s=1;
}
else if(i<j){
s=0;
}
else{
s=f(i-1,j)+f(i,j-1);
}
return (s);
}
int main(){
int m,n;
cout<<"请输入m,n:";
cin>>m>>n;
cout<<f(m,n);
}
[b]
[/b]
[b]递推方法:[/b]
#include<iostream>
using namespace std;
int main(){
int i,j,m,n;
long f[100][100];
cout<<"请输入m,n:";
cin>>m>>n;
for(i=1;i<=m;i++){
f[i][0]=1;
}
for(i=0;i<=m;i++){
for(j=i+1;j<=n;j++){
f[i][j]=0;
}
}
for(j=1;j<=n;j++){
for(i=j;i<=m;i++){
f[i][j]=f[i-1][j]+f[i][j-1];
}
}
cout<<f[m]
<<endl;
}
相关文章推荐
- C++抽象编程——STL(3)——解决排队问题的代码及其分析
- Java 编程技术中汉字问题的分析及解决
- Java 编程技术中汉字问题的分析及解决
- 分析解决局域网内盗用IP的安全问题
- Java 编程技术中汉字问题的分析及解决,文件操作
- Java 编程技术中汉字问题的分析及解决
- Java 编程技术中汉字问题的分析及解决
- Java 编程技术中汉字问题的分析及解决
- Java访问数据库的速度瓶颈问题的分析及解决
- Java 编程技术中汉字问题的分析及解决
- Java 编程技术中汉字问题的分析及解决,文件操作
- Java 编程技术中汉字问题的分析及解决
- 一次诊断和解决CPU利用率高的问题分析
- 跟踪 session 的执行,分析跟踪日志文件,解决问题的好方法
- Java 编程技术中汉字问题的分析及解决
- 数据库性能优化分析案例---解决SQL语句过度消耗CPU问题
- Java 编程技术中汉字问题的分析及解决
- 转:Java 编程技术中汉字问题的分析及解决
- Java 编程技术中汉字问题的分析及解决(从根源上解决) (转)
- Java 编程技术中汉字问题的分析及解决,文件操作