从放苹果问题到零钱兑换问题(动态规划)
放苹果问题
题目描述
把m个同样的苹果放在n个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。
数据范围:0<=m<=10,1<=n<=10。
输入描述:输入两个int整数
输出描述:输出结果,int型
示例1
输入:7 3
输出:8
举例:
总结:
- m=0,没有苹果,所有盘子空着,一种放法,即f(0,n) = 1;
- n=0,没有盘子,没办法放,即f(m,0) = 0;
- m=1,一个苹果,只有一种放法,即f(1,n) = 1;
- n=1,一个盘子,只有一种放法,即f(m,1) = 1;
- m<n,盘子比苹果多,多余的盘子不起作用,即f(m,n)=f(m,m);
- 每次放苹果都有两种放法可以选择,总的放法等于二者之和:f(m,n)=f(m,n-1)+f(m-n,n)
递归解法
//递归写法
int f(int m, int n){if(m <0 || n < 0){return 0;}if(n == 0) return 0;if(m == 0) return 1;if(m == 1 || n == 1) return 1;return f(m-n,n) + f(m,n-1);
}
动态规划
根据已知条件可写出状态方程:
- f(0,n) = 1;
- f(m,0) = 0;
- f(1,n) = 1;
- f(m,1) = 1;
- f(m,n)=f(m,m),m<n
- f(m,n)=f(m,n-1)+f(m-n,n)
//动态规划int dp[11][11]= {0};//初始化for(int i=0; i<=m; ++i){for(int j=0; j<=n; ++j){if(i==1 || j ==1 || i==0){dp[i][j] = 1;}else if(i-j <0){dp[i][j] = dp[i][i];}else{dp[i][j] = dp[i-j][j] + dp[i][j-1];}}}cout<<dp[m][n]<<endl;
零钱兑换
题目描述
想兑换100元钱,有1,2,5,10四种钱,问总共有多少兑换方法
#include <iostream>
#include <vector>
using namespace std;
const int moneys = 100;
int coins[] = { 1,2,5,10 };//m 是剩余的钱,n 是剩余可选择的面值
int getExchageTimes(int m, int n) {//钱为0的情况if (m == 0) return 1;//不能兑换的情况if (m < 0 || n <= 0) return 0;//选择当前面值+不选择当前面值return getExchageTimes(m - coins[n - 1], n) + getExchageTimes(m, n - 1);
}
const int N = 100;
int arr[N + 1] = { 1 };
int coinExchange(int n) //非递归实现
{int i, j;//i从0 ~ 3 因为每个arr[j]都要有一次是假设兑换了coins[i],所以我们要遍历一次for (i = 0; i < 4; i++){for (j = coins[i]; j <= n; j++)//求,arr[j]的时候,可以看出arr[j] = arr[j] + arr[j-coins[i]],//对应着上面的递归方式:arr[j]就是getExchageTimes(n, m-1),//arr[j-dimes[i]]就是getExchageTimes(n-coins[m-1], m)arr[j] = arr[j] + arr[j - coins[i]];}return arr[n];
}int main(void) {int a[6] = { 1,2,3 };//递归cout << getExchageTimes(moneys,4) << endl;//动态规划cout << coinExchange(1) << endl;return 0;
}
参考文章:
动态规划--换零钱
从放苹果问题到零钱兑换问题(动态规划)相关推荐
- 322. 零钱兑换 golang 动态规划
题目 零钱兑换 给定不同面额的硬币 coins 和一个总金额 amount.编写一个函数来计算可以凑成总金额所需的最少的硬币个数.如果没有任何一种硬币组合能组成总金额,返回 -1. 示例 1: 输入: ...
- 98. Leetcode 518. 零钱兑换 II (动态规划-完全背包)
完全背包: 如果求组合数: 外层for遍历循环物品,内层for遍历循环背包容量 如果求排列数: 外层for遍历循环背包容量, 内层for遍历循环物品 步骤一.确定状态: 确定dp数组及下标含义 这里的 ...
- leetcode 322. Coin Change | 322. 零钱兑换(动态规划)
题目 https://leetcode.com/problems/coin-change/ 题解 也许是第一次在没看答案的情况下写的动态规划- 第一反应是,这题不是广义背包吗?想了一下,不是,因为广义 ...
- 动态规划思路和Python解决零钱兑换问题和最大乘积子序列的乘积的问题
动态规划(Dynamic Programming)思路和Python解题示例 动态规划是一种主要用来优化朴素递归的方法,每当输入不同值调用递归函数出现大量重复的(子)输入和调用(返回结果)时,就可以考 ...
- 算法训练Day44 动态规划专题- 背包问题 | 完全背包基础知识;LeetCode518. 零钱兑换(装满背包有多少种方法,组合数);377.组合总和IV(装满背包有多少种方法,排列数)
前言: 算法训练系列是做<代码随想录>一刷,个人的学习笔记和详细的解题思路,总共会有60篇博客来记录,计划用60天的时间刷完. 内容包括了面试常见的10类题目,分别是:数组,链表,哈希表 ...
- 动态规划学习:零钱兑换
change 一.零钱兑换问题I 二.零钱兑换问题II 一.零钱兑换问题I 给定一组面额硬币,每组硬币可能有多个,给定一个总金额amount,求组成总金额所需的最少硬币数,若组不成返回-1 代码实现 ...
- 从《零钱兑换》开始的《背包问题》
1. 零钱兑换 Leetcode里有这样一个问题,LeetCode322. 零钱兑换: "给你一个整数数组 coins ,表示不同面额的硬币:以及一个整数 amount ,表示总金额.计算并 ...
- leetocde 518 零钱兑换II
前言 题目:518. 零钱兑换 II 参考:完全背包问题-大草.零钱兑换 II-力扣官方题解 提交代码 我可以理解01背包的滚动数组,但是我理解不了完全背包的滚动数组. 理解不了,便用二维数组.虽然二 ...
- LeetCode 322. 零钱兑换
322. 零钱兑换 难度 中等 给你一个整数数组 coins ,表示不同面额的硬币:以及一个整数 amount ,表示总金额. 计算并返回可以凑成总金额所需的 最少的硬币个数 .如果没有任何一种硬币组 ...
最新文章
- 带你了解『百度智能云发布云智一体的AI开发全栈模式』
- 思考如何保证线程并行的数据安全性
- 关于自动布局更新约束方法的总结
- 快速替换图片的组合-AE-样片!
- sql between 效率高吗_整个SQL语句的执行效率都靠它了...
- Python 父目录获取
- oracle optimizer_index_cost_adj,OPTIMIZER_INDEX_COST_ADJ与成本计算
- STC89C52RC的AD7705读写实验(软件SPI)
- 将多个文件合并为一个文件
- chrome报Slow network is detected.
- Windows10修改本地用户账户名(彻底修改)
- matlab复数方程的根,matlab解超越方程的复数根
- java设计模式adapter,java设计模式-适配器模式(Adapter)
- Linux系统配置网卡ip地址
- 剑指offer-二叉树(python)
- android设置EditText为不可编辑状态
- 关于f(tx,ty)=t^nf(x,y)的学习
- 全自动配色网站。前端人员练手项目。专业配色网站
- 数据结构 作业答案 第1章 绪论
- 如何在 IIS 中添加 MIME 类型
热门文章
- linux实验报告一,Linux实验报告6参考答案.doc
- HEHL6下配置GCC及KVM安装
- 翻译GDC演讲《精心制作一个微小的开放世界:‘A Short Hike‘ 事后分析》(1):立项,画风
- 【网络请求之Axios】axios的基础用法
- SLAM第五讲点云拼接思路笔记
- Windchill 10.0 建模,定义BLOB字段
- 学习率和BatchSize对模型的影响
- 2021中国奢华品报告:内地消费信心恢复至新冠疫情前水平,香港地区消费信心基本恢复...
- 基于Sentry高效治理前端异常
- 基于单片机的噪声监测系统设计(#0474)