php网站搭建西安百度seo
news/
2025/10/8 6:01:05/
文章来源:
php网站搭建,西安百度seo,服装网站建设公司,深圳 网站开发公司电话给你一个整数数组 coins #xff0c;表示不同面额的硬币#xff1b;以及一个整数 amount #xff0c;表示总金额。计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额#xff0c;返回 -1 。
你可以认为每种硬币的数量是无限的。
示例…给你一个整数数组 coins 表示不同面额的硬币以及一个整数 amount 表示总金额。计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额返回 -1 。
你可以认为每种硬币的数量是无限的。
示例 1
输入coins [1, 2, 5], amount 11 输出3 解释11 5 5 1 示例 2
输入coins [2], amount 3 输出-1 示例 3
输入coins [1], amount 0 输出0
思路
先确定「状态」 也就是原问题和⼦问题中变化的变量。 由于硬币数量⽆ 限 所以唯⼀的状态就是⽬标⾦额 amount
然后确定 dp 函数的定义 当前的⽬标⾦额是 n ⾄少需要 dp(n) 个硬 币凑出该⾦额。
这里dp类似一个函数n是参数dp[n]是返回值。n一般是题目中变化的量dp[n]一般是所求的最优值。
这里for循环i从0开始不用担心dp[i]的下标变为负值。因为有条件if (i - coin 0) continue;控制。dp[i]一定要先求出i小的再逐渐变大。
int coinChange(vectorint coins, int amount) {
// 数组⼤⼩为 amount 1 初始值也为 amount 1
vectorint dp(amount 1, amount 1);
// base case
dp[0] 0;
for (int i 0; i dp.size(); i) {
// 内层 for 在求所有⼦问题 1 的最⼩值
for (int coin : coins) {
// ⼦问题⽆解 跳过
if (i - coin 0) continue;
dp[i] min(dp[i], 1 dp[i - coin]);
动态规划解题套路框架
34}
} r
eturn (dp[amount] amount 1) ? -1 : dp[amount];
}再比如房屋偷盗问题 题目输入一个数组表示某条街道上的一排房屋内财产的数 量。如果这条街道上相邻的两幢房屋被盗就会自动触发报警系统。 请计算小偷在这条街道上最多能偷取到多少财产。例如街道上5幢 房屋内的财产用数组[23453]表示如果小偷到下标为0、2 和4的房屋内盗窃那么他能偷取到价值为9的财物这是他在不触 发报警系统的情况下能偷取到的最多的财物如图14.3所示。被盗 的房屋上方用特殊符号标出
可以用fi表示小偷从标号为0的房屋开始到标号 为i的房屋为止最多能偷取到的财物的最大值
i是下标fi是财物最值而且这里的起始下标为0.
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/931129.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!