贪心算法
找零钱问题
« 问题描述
设有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 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;
}