找零钱问题

找零钱问题

« 问题描述

设有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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值