322. 零钱兑换

零钱兑换问题是一个经典的动态规划应用场景。通过定义dp数组,初始设置为较大数,除dp[0]=0。状态转移方程为dp[i]=min(dp[i], dp[i-coin]+1),遍历硬币数组并更新dp。最后返回dp[amount],若为大数则返回-1,否则返回其值。注意,不应使用length()获取vector长度,而应直接遍历数组。" 106477630,8675467,webpack中CSS及LESS文件的处理,"['前端开发', 'CSS', 'Webpack', 'JavaScript', '预处理语言']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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];
        }
}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海波东

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值