算法之Python实现 - 002 : 换钱的最少货币数补充(每种货币只能使用一次)

【题目】:给定数组arr,arr中所有的值都为正数且不重复。每个值代表一种面值的货币,每种面值的货币仅可以使用一张,再给定一个整数aim代表要找的钱数,求组成aim的最少货币数。

【代码1】:时间与额外空间复杂度O(N*aim)

import numpy as np
from xmlrpc.client import MAXINT

def mincoin(arr,aim):
    if len(arr)<0:
        print("No coin provided for change!")
    if sum(arr)<aim:
        print("Coins provided not enough for change!")
    arr.sort()
    arr.reverse()
    if aim == 0:
        print("Aim is 0, no need to change!")
    i = 0
    j = 0
    maxval = 99#MAXINT
    dp = np.zeros((len(arr),aim+1))
    for i in range(1,len(arr)):
        dp[i] = np.array([99]*(aim+1))
        dp[i][0] = 0

    if arr[0]<= aim:
        dp[0][arr[0]] = 1

    left = 0
    for i in range(1,len(arr)):
        for j in range(1,aim+1):
            left = maxval
            if j-arr[i] >= 0 and dp[i-1][j-arr[i]] != maxval:
                left = dp[i-1][j-arr[i]]+1
            dp[i][j] = min(left,dp[i-1][j])

    #print(dp)
    #print(‘Need ‘,int(dp[aim]),‘ Coins.‘)
    print(‘Need ‘,int(dp[len(arr)-1][aim]),‘ Coins.‘)

# ===CALL === #
a = [5,2,3,5,8]
tar = 20
mincoin(a,tar)    

【代码2】:时间复杂度O(N*aim),额外空间复杂度O(aim)

import numpy as np
from xmlrpc.client import MAXINT

def mincoin(arr,aim):
    if len(arr)<0:
        print("No coin provided for change!")
    if sum(arr)<aim:
        print("Coins provided not enough for change!")
    arr.sort()
    arr.reverse()
    if aim == 0:
        print("Aim is 0, no need to change!")
    i = 0
    j = 0
    maxval = 99#MAXINT
    dp = np.array([99]*(aim+1))
    dp[0] = 0

    if arr[0]<= aim:
        dp[arr[0]] = 1

    left = 0
    for i in range(1,len(arr)):
        for j in range(1,aim+1):
            left = maxval
            if j-arr[i] >= 0 and dp[j-arr[i]] != maxval:
                left = dp[j-arr[i]]+1
            dp[j] = min(left,dp[j])

    #print(dp)
    #print(‘Need ‘,int(dp[aim]),‘ Coins.‘)
    print(‘Need ‘,int(dp[aim]),‘ Coins.‘)

# ===CALL === #
a = [5,2,3,5,8]
tar = 20
mincoin(a,tar)    

【代码3】:时间复杂度O(N*aim),额外空间复杂度O(aim) 

同样的在原书也就是【代码2】的基础上,下面的执行效率会更高一点点,但是这种算法对于【代码1】的复杂度是有问题的。

import numpy as np
from xmlrpc.client import MAXINT

def mincoin(arr,aim):
    if len(arr)<0:
        print("No coin provided for change!")
    if sum(arr)<aim:
        print("Coins provided not enough for change!")
    arr.sort()
    arr.reverse()
    if aim == 0:
        print("Aim is 0, no need to change!")
    i = 0
    j = 0
    maxval = 99#MAXINT
    dp = np.array([99]*(aim+1))
    dp[0] = 0

    if arr[0]<= aim:
        dp[arr[0]] = 1

    left = 0
    for i in range(1,len(arr)):
        for j in range(j-arr[i],aim+1):
            left = maxval
            if dp[j-arr[i]] != maxval:
                left = dp[j-arr[i]]+1
            dp[j] = min(left,dp[j])

    #print(dp)
    #print(‘Need ‘,int(dp[aim]),‘ Coins.‘)
    print(‘Need ‘,int(dp[aim]),‘ Coins.‘)

# ===CALL === #
a = [5,2,3,5,8]
tar = 20
mincoin(a,tar)    

原文地址:https://www.cnblogs.com/ElfoDigger/p/10605620.html

时间: 2024-10-12 03:34:39

算法之Python实现 - 002 : 换钱的最少货币数补充(每种货币只能使用一次)的相关文章

【动态规划专题】3:换钱的最少货币数

<程序员代码面试指南--IT名企算法与数据结构题目最优解> 左程云 著 换钱的最少货币数 [题目] 给定数组arr, arr中所有的值都为正数且不重复.每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个整数aim,代表要找的钱数,求组成aim的最少货币数. [举例]arr=[5,2,3],aim=204张5元可以组成20元,其他找钱方案都要使用更多的货币,所以返回4. arr=[5,2,3],aim=0不用任何货币就可以组成0元,返回0 arr=[3,5],aim=2根本没法组

[程序员代码面试指南]递归和动态规划-换钱的最少货币数

题目描述 给定arr,arr中所有的值都为正数且不重复.每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个整数aim,求组成aim的最少货币数. 解题思路 dp[i][j]表示只用第0到i种货币,凑成j元的最小货币张数. 初始化: 转移方程: dp[i][j]=min{dp[i-1][j-k*arr[i]]+k} (k>=0) 整理得 dp[i][j]=min{dp[i-1][j],min{dp[i-1][j-k*arr[i]]+k}} (k>=1) 变换得 dp[i][j]=

换钱最少货币数

给定数组arr,arr中所有的值都为正数且不重复.每个值代表一种面值的货币,每种面值的货币可以使用任意张,在给定一个整数aim代表要找的钱数,求组成aim的最少货币数. 代码: public class MinCoins { public static int minCoins(int[] arr, int aim) { if(arr == null || arr.length==0 || aim<=0) { return 0; } int len = arr.length; int max =

动态规划-换钱最少货币数

#encoding:utf-8 _author_ = "Wang Wenchao" #换钱最少的货币数 #给定数组arr,arr中所有的值都为正数且不重复.每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个正数aim代表要找的钱数,求组成aim的最少货币数 ''' arr=[5,2,3],aim=20 4张5元可以组成20元,所以返回4 arr=[5,2,3],aim=0 返回0 arr=[3,5],aim=2 返回-1 ''' #解法:arr长度为N,生成行数为N的,

每日一题之动归-换钱的最少次数(一)

题目: 给定数组arr,arr中所有的值都为正数且不重复.每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个整数aim代表要找的钱数,求组成aim的最少货币数. 举个例子 arr[5,2,3] ,aim=20 4张5元可以组成20,并且是最小的,所以返回4 arr[5,2,3],aim=0. 不用任何货币就可以组成0元,这里返回0. arr[5,2,3],ami=4 这里无法组成返回-1 思路:这里我们采用经典的动态规划的方法做,时间复杂度可以在O(n^2). 经典动态规划的放法

常用排序算法的python实现

排序算是编程最基本的算法问题之一了,熟练掌握排序算法也能加深自己对数据结构的理解,也能提高自己的编程能力,以下为个人参考许多大神博客后对常用排序算法的学习总结. 目录: 概述 冒泡排序 直接插入排序 简单选择排序 希尔排序 堆排序 归并排序 快速排序 算法的比较与测试 参考 1. 概述 所谓排序(sorting)就是整理数据的序列,使其按照特定顺序排列的操作.排序在现实生活中(如整理书籍,表格数据等),在计算领域中(如二分查找,图论的最小生成树的Kruskal算法)均有重要意义,所以一种高效的排

《机器学习实战》之K-均值聚类算法的python实现

<机器学习实战>之K-均值聚类算法的python实现 最近的项目是关于"基于数据挖掘的电路故障分析",项目基本上都是师兄们在做,我只是在研究关于项目中用到的如下几种算法:二分均值聚类.最近邻分类.基于规则的分类器以及支持向量机.基于项目的保密性(其实也没有什么保密的,但是怕以后老板看到我写的这篇博文,所以,你懂的),这里就不介绍"基于数据挖掘的电路故障分析"的思路了. 废话不多说了,开始正题哈. 基本K-均值聚类算法 基本K均值算法的基本思路为:首先选择

《机器学习实战》之二分K-均值聚类算法的python实现

<机器学习实战>之二分K-均值聚类算法的python实现 上面博文介绍了K-均值聚类算法及其用python实现,上篇博文中的两张截图,我们可以看到,由于K-均值聚类算法中由于初始质心的选取,会造成聚类的局部最优,并不是全局最优,因此,会造成聚类的效果并不理想,为克服K-均值算法收敛于局部最小值的问题,就有了二分K-均值算法. 二分K-均值聚类算法 二分K均值算法是基本K均值算法的直接扩充,其基本思想是:为了得到K个簇,首先将所有点的集合分裂成两个簇,然后从这些簇中选取一个继续分裂,迭代直到产生

分类算法——k最近邻算法(Python实现)(文末附工程源代码)

kNN算法原理 k最近邻(k-Nearest Neighbor)算法是比较简单的机器学习算法.它采用测量不同特征值之间的距离方法进行分类,思想很简单:如果一个样本在特征空间中的k个最近邻(最相似)的样本中大多数属于某一个类别,则该样本也属于这个类别. kNN算法的步骤 第一阶段:确定k值(指最近的邻居的个数),一般是一个奇数 第二阶段:确定距离度量公式.文本分类一般使用夹角余弦,得出待分类数据点和所有已知类别的样本点,从中选择距离最近的k个样本: 第三阶段:统计这k个样本点钟各个类别的数量 kN