最少硬币问题最少硬币问题
系别 专业 计算机科学与班姓名
技术 级
课程名算法设计与分析 课程类型 学时数 称
实验名最少硬币问题
称
实验目的:
理解动态规划算法的概念
掌握动态规划算法的基本要素
熟练掌握动态规划算法的算法思想和实现的步骤
能够运用动态规划算法去解决一些实际相关的问题
内容和步骤:
实验内容:
设有n 种不同面值的硬币,各硬币的面值存于数组T,1:n,中。
现要用这些面值的硬币来找钱。可以使用的各种面值的硬币个数存于
数组Coins,1:n,中。
对任意钱数0?m?20001,设计一个用最少...
最少硬币问题
系别 专业 计算机科学与班姓名
技术 级
课程名算法设计与分析 课程类型 学时数 称
实验名最少硬币问题
称
实验目的:
理解动态规划算法的概念
掌握动态规划算法的基本要素
熟练掌握动态规划算法的算法思想和实现的步骤
能够运用动态规划算法去解决一些实际相关的问题
内容和步骤:
实验内容:
设有n 种不同面值的硬币,各硬币的面值存于数组T,1:n,中。
现要用这些面值的硬币来找钱。可以使用的各种面值的硬币个数存于
数组Coins,1:n,中。
对任意钱数0?m?20001,设计一个用最少硬币找钱m的方法。
实验要求:要求问题描述用动态规划算法来实现。
运行结果:
3
1 3
2 3
5 3
18
5
源程序代码:
#include
using namespace std;
int main()
{
cout<<" ------------------------------------------------------------- "<书
| "<
>ch;
int n,i,m,t,v,count = 0;
cout<<"输入货币种类:"<>n;
int *value=new int[n+1],*value1=new int[n+1];
int *q=new int [n+1];
for(i=1;i<=n;i++)
{
cout<<"输入"<>value[i];
cout<<"输入"<>q[i];
value1[i]=value[i]*q[i];
count = count + value1[i];
}
while(ch != 'q')
{
if(ch == 's')
{
cout<<"请输入要兑换的货币面值:"<>m;
if(count > m)
{
int *way=new int [m+1];
int *way1=new int [m+1];
way1[0]=way[0]=0;
for(i=1;i<=m;i++)
{
if(value1[1]>=i&&i%value[1]==0)
2
课程实践报告书
{
way1[i]=way[i]=i/value[1];
}
else
{
way1[i]=way[i]=0;
}
}
int j;
for(j=2;j<=n;j++)
{
for(i=value[j];i<=m;i++)
{
t=1;
while(t<=q[j]&&value[j]*t<=i)
{
if((i-value[j]*t)&&way[i-value[j]*t]==0)
{
t++;
continue;
}
else
{
v=t+way[i-value[j]*t];
}
if(way1[i]==0||way1[i]>v)
{
way1[i]=v;
}
t++;
}
}
for(i=1;i<=m;i++)
{
way[i]=way1[i];
3
课程实践报告书
}
}
if(way[m]==0)
{
way[m]=-1;
}
cout<<"需要的最少硬币数:"<>ch;
}
}
实验:
本次实验中,刚开始对动态规划算法的两个基本要素,既最优子结构性
及子问题重叠性的寻找存在一定的问题,动态规划算法是一种自底向上求解的
过程。
成绩 批阅教师 批阅日期
4
本文档为【最少硬币问题】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。