2020-02-24:arr是面值数组,其中的值都是正数且没有重复。再给定一个正数aim。每个值都认
2021-02-24 21:58
976 查看
福哥答案2020-02-24:
自然智慧即可。
1.递归。有代码。
2.动态规划。dp是二维数组。有代码。
代码用golang编写,代码如下:
package main import ( "fmt" ) func main() { arr := []int{1, 2, 3} aim := 8 ret := minCoins1(arr, aim) fmt.Println("1.递归:", ret) ret = minCoins2(arr, aim) fmt.Println("2.动态规划:", ret) } const INT_MAX = int(^uint(0) >> 1) func minCoins1(arr []int, aim int) int { return process1(arr, 0, aim) } func process1(arr []int, index int, rest int) int { if index == len(arr) { if rest == 0 { return 0 } else { return INT_MAX } } else { ans := INT_MAX for zhang := 0; zhang*arr[index] <= rest; zhang++ { next := process1(arr, index+1, rest-zhang*arr[index]) if next != INT_MAX { if ans > zhang+next { ans = zhang + next } } } return ans } } func minCoins2(arr []int, aim int) int { if aim == 0 { return 0 } N := len(arr) dp := make([][]int, N+1) for i := 0; i < N+1; i++ { dp[i] = make([]int, aim+1) } dp [0] = 0 for j := 1; j <= aim; j++ { dp [j] = INT_MAX } for index := N - 1; index >= 0; index-- { for rest := 0; rest <= aim; rest++ { dp[index][rest] = dp[index+1][rest] if rest-arr[index] >= 0 && dp[index][rest-arr[index]] != INT_MAX { dp[index][rest] = getMin(dp[index][rest], dp[index][rest-arr[index]]+1) } } } return dp[0][aim] } func getMin(a int, b int) int { if a < b { return a } else { return b } }
执行结果如下:
相关文章推荐
- 给定一个长度为N的数组,其中每个元素的取值范围都是1到N。判断数组中是否有重复的数字。(原数组不必保留)
- 面试题:给定一个长度为N的数组,其中每个元素的取值范围都是1到N。判断数组中是否有重复的数字
- 给定一个无序的整型数组arr,找到其中最小的k个数。
- 给定一个没有重复数的数组。建立一棵最大树
- 每天一道算法题(二):给定数组Arr和一个整数aim,请返回哪两个位置的数可以加出aim来。
- 给定一个有序数组,删除重复内容,使每个元素只出现一次
- 给定整数数组,返回一个新数组,使得新数组的索引i中的每个元素都是原始数组中除i中的所有数字的乘积。Python实现。
- Linux系统中,有两个文件file1和file2,每个文件的每一行都是#UUID,其中的每一UUID表示一个号。要找出在file1中有而在file2中没有的UUID,使用cat,sort,uniq三个命令如何实现
- 给定一个无穷数组A[.],其中前n个元素都是整数,且已经排好序,剩余元素均为∞。n的值未知。给出一个算法,以一个整数x为输入,以O(logn)时间找到数组中的一个位置,并满足其上的元素为x
- 给定一个字符串s和一个单词dict的字典,在s中添加空格来构造一个句子,其中每个单词都是有效的字典单词。
- 给定一个排序数组,删除重复的位置,使每个元素只出现一次,并返回新的长度。
- 给定一个没有重复的已排序整数数组,返回其范围的摘要。
- 程序员面试金典——解题总结: 9.18高难度题 18.11给定一个方阵,其中每个单元(像素)非黑即白。设计一个算法,找出四条边都是黑色像素的最大子方阵。
- 每日算法(十五)-java给定一个有序数组,删除其中重复元素,只保留一个,并返回新数组的长度
- 删除排序数组中的重复项 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素最多出现一次,返回移除后数组的新长度。 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1)
- List的All方法使用问题:我用List1的All方法来确保List1的所有每个数组元素中是否包含Arr1中的任意元素,这个部分很难实现。 因为,没有一个数组中是否包含另一个数组中的任意元素这个功能
- @陈利人 : #面试题#给定两个数组X和Y,元素都是正数。请找出满足如下条件的数对的数目: x^y > y^x,即x的y次方>y的x次方;x来自X数组,y来自Y数组
- 创建带有可供点击区域的图像地图。其中的每个区域都是一个超级链接
- 给定一个数字列表,返回其所有可能的排列。 注意事项 你可以假设没有重复数字。
- 用Java解决牛客网给定一个整数数组,判断其中是否有3个数和为N问题