最少硬币问题
【题目描述】
使用3枚币值分别为 1、3、5的硬币兑换11,最少需要几枚硬币。
【思路】
- 确定状态 :
- -最后一步:最优策略中使用的最后一枚硬币ak
- -化成子问题:用最少的硬币依次从小面值拼到大面值
- -状态:tmp[x]=最少用多少枚硬币拼出x
- 转移方程:tmp[i]=min{tmp[i-1]+1,tmp[i-3]+1,tmp[i-5]+1}
- 初始条件和边界情况:设初始值:tmp[0]=0因为转移方程无法求出tmp[0];若不能拼出来i,则tmp[i]为无穷大;
- 计算顺序:tmp[1],tmp[2]……tmp[11]
#include<iostream>
using namespace std;
#define INF 99999
int main(){
int coin[3]={1,3,5};
int tmp[12];//注意这里开数组要开11+1次
tmp[0]=0;
for(int i=1;i<12;i++){//试图拼出1-11的面值
tmp[i]={INF};//将1到11的每个元素设置无穷大,以便于min中的比较
for(int j=0;j<3;j++){
if(i>=coin[j] && tmp[i-coin[j]]!=INF){/*若i<coin[j] 或者 tmp[i-coin[j]]+1是无穷大,则表示这个数字拼不出来*/
tmp[i]=min(tmp[i-coin[j]]+1,tmp[i]);//从tmp[i-1]+1,tmp[i-3]+1,tmp[i-5]+1中求出硬币最少的那个tmp,若拼不出来,则返回无穷大
}
}
}
if(tmp[11]==INF){//如果是这样,则拼不出11
tmp[11]=-1;}
cout << "tmp[11]=" << tmp[11] << endl;
return 0;
}
动态规划与递归的区别:递归是自顶向下求,某个元素需求多次,时间复杂度高成指数次幂增长;而动态规划是自底向上求,保留了每个元素的值,时间复杂度低为:11*3
机器人走方格
【题目描述】:M * N的方格,一个 机器人 从左上走到右下,只能向右或向下走。有多少种不同的走法?