零钱相加最少多少张

package main

import "fmt"

func main() {

	/*
	给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。
	如果没有任何一种硬币组合能组成总金额,返回 -1。

	示例 1:
	输入: coins = [1, 2, 5], amount = 11
	输出: 3
	解释: 11 = 5 + 5 + 1
	*/

	/*
	1.先把最大的数找出来,累加,超了就找小于自己的数
	2.再继续找倒数第二大的数,累加,超了就找小于自己的数,。。。
	*/

	coins := []int{1, 2, 5}
	amonut := 100 //20次

	//标志位
	flag := 0
	//总金额
	sum := 0

	//5块
	for amonut > sum {
		max_sum := coins[2]
		sum += max_sum
		flag += 1
		if amonut < sum {
			//如果超过了就减去一次最大数
			sum -= max_sum
			flag -= 1
			break
		} else if amonut == sum {
			fmt.Println(flag)
		}
	}

	//3块
	//减去一次最大数的sum肯定小于amonut
	for amonut > sum {
		max_sum_2 := coins[1]
		sum += max_sum_2
		flag += 1
		if amonut < sum {
			sum -= max_sum_2
			flag -= 1
			break
		} else if amonut == sum {
			fmt.Println(flag)
		}

	}

	//1块
	//减去一次 次 大数的sum肯定小于amonut
	for amonut > sum {
		max_sum_3 := coins[0]
		sum += max_sum_3
		flag += 1
		if amonut < sum {
			sum -= max_sum_3
			flag -= 1
			break
		} else if amonut == sum {
			fmt.Println(flag)
		}

	}
}

  

原文地址:https://www.cnblogs.com/yzg-14/p/12373124.html