class Solution {
public:
int coinChange(vector<int>& coins, int amount) {
vector<int> dp(amount+1, INT_MAX);
dp[0] = 0;//初始化是不为0的;
for(int i = 1 ; i <= amount ; i ++)
{
for(int coin : coins)
{
if(coin <= i && dp[i-coin] != INT_MAX )
{
dp[i] = min(dp[i], dp[i-coin]+1);
}
}
}
if(dp[amount]==INT_MAX) return -1;
else
return dp[amount];
}
};
这种类型非常类似背包, 1是能否想到用INT_MAX;
2是如何定义状态数组
零钱兑换问题是一个典型的动态规划问题,可以使用动态规划的方法来解决。下面是分析和解决该问题的步骤:
定义状态:定义一个一维数组dp,其中dp[i]表示总金额为i时所需的最少硬币个数。
初始化:将dp数组的所有元素初始化为一个较大的数,除了dp[0] = 0,表示总金额为0时不需要任何硬币。
状态转移方程:对于每个总金额i,遍历硬币数组coins,对于每个硬币面额coin,如果coin <= i,即硬币面额小于等于当前总金额,则可以使用该硬币来组成总金额i。此时,所需的最少硬币个数为dp[i-coin] + 1,其中dp[i-coin]表示总金额为i-coin时所需的最少硬币个数。从所有硬币中选择最小的硬币个数。
可以使用状态转移方程来更新dp数组中的每个元素:dp[i] = min(dp[i], dp[i-coin] + 1)。
填充整个dp数组:根据状态转移方程,使用两个嵌套的循环来遍历总金额和硬币数组,并根据状态转移方程更新dp数组的值。
返回答案:最终的答案即为dp[amount],如果dp[amount]为较大的数(表示无法组成总金额),则返回-1,否则返回dp[amount]。
下附vector用法
```cpp
vector<int> vec(5, 0); // 初始化一个包含5个初始值为0的int类型的vector
vector<int> vec = {1, 2, 3, 4, 5}; // 利用初始化列表初始化int类型的vector
特别注意上面是大括号;
vector<int> source = {1, 2, 3, 4, 5};
vector<int> vec(source.begin(), source.end()); // 从另一个vector初始化一个新的vector
vector<int> coins ;
coins = {1, 2, 5};
string a = "afdaf";
cout << a.length() << endl;
// cout << coins.length() << endl;
cout << coins.size() << endl;
vector coins 不能用length(), 来求,cout << coins.length() << endl;是错误的
for(int coin : coins)
比较神奇直接遍历数组的值
package org.example;
import java.net.Inet4Address;
import java.util.Arrays;
import java.util.Comparator;
import java.util.LinkedList;
import java.util.Scanner;
import java.util.stream.IntStream;
import static java.util.Comparator.*;
public class Main {
public static void main(String[] args) {
//零钱兑换
Solution solution = new Solution();
int[] coins = {1, 2, 5};
int amount = 11;
System.out.println(solution.coinChange(coins, amount));
}
public static class Solution {
public int coinChange(int [] coins , int amount)
{
int[] dp = new int[amount + 1];
Arrays.fill(dp, Integer.MAX_VALUE);
dp[0] = 0;
for( int i = 0 ; i <= amount ; i++ )
{
for(int coin :coins ){
if(coin <= i && dp[i-coin]!= Integer.MAX_VALUE)
{
dp[i] = Math.min(dp[i], dp[i-coin]+1);
}
}
}
return dp[amount] == Integer.MAX_VALUE ? -1 : dp[amount];
}
}
}