找零钱问题

找零钱问题

« 问题描述

设有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个正整数nn<=13),表示有n种硬币可选。接下来的一行是每种硬币的面值。由用户输入待找钱数j

« 结果输出

程序运行结束时,将计算出的所需最少硬币个数输出到文件output.txt中。

输入文件示例

输出文件示例

input.txt

output.txt

3

1 2 5

9

3

代码:#include <stdio.h>
#include <stdlib.h>
#include<fstream.h>

int *price;
int *ret;
int change(int total,int array[],int begin,int end)//找零钱递归函数
{
if(total == array[begin])//total = 最大的面值,测试数据5=5
ret[begin]++;
else
{
while(begin<end)
{
if(total>array[begin])//测试数据9>5
{
ret[begin]++;
if (change(total-array[begin],array,begin,end))
return 1;
else
ret[begin]--;
}

begin++;
}
return 0;//测试数据0<1
}
return 1;//测试数据5>5
}

int main(int argc,char** argv)
{
ifstream in("input.txt");//打开输入文件
ofstream out("output.txt");//打开输出文件
int n;
in>>n;//从输入文件读入零钱面值数目到n
price=(int *)malloc(sizeof(int)*(n+1));
ret=(int *)malloc(sizeof(int)*(n+1));
ret[0]=0;
price[0]=0;
for(int j =1;j<=n;j++)
{
ret[j]=0;
in>>price[n-j+1];//从输入文件从大到小读入零钱面值到price[n-j-1]
}
int money;
in>>money;//从输入文件读如要找零钱到money


int i = 0;
change(money,price,1,n);//找零钱递归函数


int sum = 0;
for(i=0; i<=n; i++)
sum+=ret[i];
out<<sum;//记录所需零钱最小数到输出文件
out<<endl;
system("type output.txt");//显示输出文件
in.close;//关闭输入文件
out.close;//关闭输出文件
system("pause");
return 0;
}

http://hi.baidu.com/corein/blog/item/38c98fcd4ed0dd540fb345f5.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值