换硬币
-
输入:coins={1,2,3,4}; target=10。最少使用的硬币数是3
输入:coins={1,5,11}; target=20 。最少使用的硬币数是4 -
思路,首先应该有两个null;‘
1、memo[n]为-2;//memo[0]=0;
2、返回来的count为-1; -
代码:
class Flipcoins
{
public void MainFlipCoins()
{
//输入:coins={1,2,3,4}; target=10
// 最少使用的硬币数是3
//(特殊)输入:coins ={ 1,5,11}; target = 20
int[] coins = { 1,5,11 };
int target = 20;
int[] memo = new int[target + 1];
for(int i = 0; i < memo.Length; i++)
{
memo[i] = -2;
}
memo[0] = 0;
Console.WriteLine(FlipACoin(target, coins, memo));
}private int FlipACoin(int target,int[] coins, int[] memo) //备忘模型 { if (memo[target] != -2) { return memo[target];//当memo[0]=0; } int result = -1; for (int i = 0; i < coins.Length; i++) { int NexTarget = target - coins[i]; if (NexTarget >= 0)//当且仅当当前硬币<目标值时,count++ { int temp = FlipACoin(NexTarget, coins, memo); if (temp != -1 && (result == -1 || temp + 1 < result)) //temp为-1时,上一个没值 //result为-1时,当前没值 //temp+1<result; 新的值<当前值 { result = temp + 1; } } } return result; } private int FlipACoin(int target, int[] coins, int[] memo)//循环 { for(int num = 1; num <= target; num++) { int result = -1; for(int i = 0; i < coins.Length; i++) { if (num >= coins[i]) { int temp = memo[num - coins[i]];//当memo[0]=0时 if (temp != -1 && (result == -1 || temp + 1 < result)) { result = temp + 1; } } } memo[num] = result; } return memo[target]; }
}