C++实现最少硬币兑换问题

  

                            最少硬币兑换问题

#include<iostream>
#include<fstream>
using namespace std; 

int n,L;   //n种硬币L长的数组
int c[13][20];
int T[13];//硬币面值

int jisuan(int i,int j);
int main()
{
    fstream file("2.1_input.txt");   //这是需要读取数据的文件的路径。
    fstream file2("2.1_output.txt");   //这是需要输出数据的文件的路径。
    if(file.fail() || file2.fail())
    {
        cout<<"The file open error!"<<endl;
    }
    else
    {
        file>>n;
        for(int i=1;i<=n;i++)
        {
            file>>T[i];
        }
        file>>L;

    }
    int k;

       k=jisuan(n,L);
    file2<<k<<endl;

    return 0;
}

int jisuan(int i,int j)
{
    int min;
    if((i==0)||(j==0))
        c[i][j]=0;
    if(i==1)
    {
        if(((1<=j)&&(j<T[1]))||((T[1]<=j)&&(j<=L)&&(j%T[1]!=0)))
            c[i][j]=500;

        if((T[i]<=j)&&(j<=L)&&(j%T[i]==0))
            c[i][j]=j/T[i];
    }
    else
    {
        min=jisuan(i-1,j);
        for(int x=j/T[i];x>0;x--)
        {
            int a=jisuan(i-1,j-x*T[i])+x;
            if(min>a)
                min=a;
        }
        c[i][j]=min;
    }

    return c[i][j];
}

时间: 2024-11-03 10:11:27

C++实现最少硬币兑换问题的相关文章

算法笔记——硬币找零之最少硬币数

题目来源:NYOJ995 问题描述: 在现实生活中,我们经常遇到硬币找零的问题,例如,在发工资时,财务人员就需要计算最少的找零硬币数,以便他们能从银行拿回最少的硬币数,并保证能用这些硬币发工资. 我们应该注意到,人民币的硬币系统是 100,50,20,10,5,2,1,0.5,0.2,0.1,0.05, 0.02,0.01 元,采用这些硬币我们可以对任何一个工资数用贪心算法求出其最少硬币数. 但不幸的是: 我们可能没有这样一种好的硬币系统, 因此用贪心算法不能求出最少的硬币数,甚至有些金钱总数还

POJ 3260 The Fewest Coins 最少硬币个数(完全背包+多重背包,混合型)

题意:FJ身上有各种硬币,但是要买m元的东西,想用最少的硬币个数去买,且找回的硬币数量也是最少(老板会按照最少的量自动找钱),即掏出的硬币和收到的硬币个数最少. 思路:老板会自动找钱,且按最少的找,硬币数量也不限,那么可以用完全背包得出组成每个数目的硬币最少数量.而FJ带的钱是有限的,那么必须用多重背包,因为掏出的钱必须大于m,那么我们所要的是大于等于m钱的硬币个数,但是FJ带的钱可能很多,超过m的很多倍都可能,那么肯定要有个背包容量上限,网上说的根据抽屉原理是m+max*max,这里的max指

Ex 6_17 数量无限的硬币兑换问题_第七次作业

子问题定义:定义一个数组b,大小比兑换价格的大小多一个元素,其中b[i]表示是否能用面值为x1,x2,x3,..,xn的硬币兑换价格i. 递归关系: 初值设定:设b[0]=true 求解顺序:按下标从小到大依次求解b[i]的值,最后返回b[v]中的结果即为最终结果. 1 package org.xiu68.ch06.ex7; 2 3 public class Ex6_17 { 4 5 //数量无限的面值为x1,x2,x3,...,xn的硬币是否能兑换价格v 6 public static voi

奇妙的算法【9】每个小孩的糖果数,找公约数,最少硬币数

1,每个小孩的糖果数量是多少 有p个小孩,c个糖果,刚开始第1个小孩发一个糖果,第2个小孩发两个糖果,第p个小孩发p个糖果,如果糖果没有发完,就接着[注意]第1个小孩发p+1个糖果.....第p个小孩发2*p个糖果,如果糖果还没有发完,就继续下一轮,第1个小孩发2*p+1个糖果,... 方法一,遍历[这种方法太low了就折叠一下] package com.cnblogs.mufasa.Main1; import java.util.Scanner; public class Main { pub

poj 3260 最少硬币(01+多重+完全背包)

http://www.cnblogs.com/ACMan/archive/2012/08/14/2637437.html #include <iostream> #include <string> #include <cstring> #include <cstdlib> #include <cstdio> #include <cmath> #include <algorithm> #include <stack&g

leetcode 322 零钱兑换

目录 1. 题目 2. 解法 2.1. 暴力穷举 2.2. 动态规划-1 自下而上 2.3. 动态规划-2 自上而下 3. 代码及测试结果 3.1. 测试代码: 3.2. 结果: 1. 题目 零钱兑换 给定不同面额的硬币 coins 和一个总金额 amount.编写一个函数来计算可以凑成总金额所需的最少的硬币个数.如果没有任何一种硬币组合能组成总金额,返回 -1. 示例 1: 输入: coins = [1, 2, 5], amount = 11 输出: 3 解释: 11 = 5 + 5 + 1

动态规划 硬币问题

题目:有n种硬币,面值分别为V1,V2,...Vn,每种都有无限多.给定非负整数S,可以选用多少个硬币,使得面值之和恰好为S?输出硬币数目的 最小值和最大值! 如果我们有面值为1元.3元和5元的硬币若干枚,如何用最少的硬币凑够11元? (表面上这道题可以用贪心算法,但贪心算法无法保证可以求出 解,比如1元换成2元的时候) 首先我们思考一个问题,如何用最少的硬币凑够i元(i<11)?为什么要这么问呢? 两个原因:1.当我们遇到一个大问题时,总是习惯把问题的规模变 小,这样便于分析讨论. 2.这个规

BZOJ 3233: [Ahoi2013]找硬币( dp )

dp(x)表示最大面值为x时需要的最少硬币数. 枚举x的质因数p,  dp(x) = min( dp(x/p) - (p-1) * sigma[a[i]/x] ). ---------------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> using namespace

NYOJ995硬币找零(简单dp)

1 /* 2 题意:给你不同面额的硬币(每种硬币无限多),需要找零的面值是T,用这些硬币进行找零, 3 如果T恰好能被找零,输出最少需要的硬币的数目!否则请输出剩下钱数最少的找零方案中的最少硬币数! 4 5 思路:转换成完全背包的问题! 6 */ 7 #include<iostream> 8 #include<cstring> 9 #include<cstdio> 10 #include<algorithm> 11 #define INF 0x3f3f3f3