动态规划(DP)
作者:互联网
动态规划
-
计数
有多少种方式走到右下角;
有多少种方法选出 K 个数使得和是 m -
求最大最小值
从左上角走到右下角路径的最大数字和
最长上升子序列 -
求存在性
取石子游戏
能不能选出 K 个数使得和是 m
- 确定状态
最后一步(最优策略中使用的最后一枚硬币)
化成子问题(最少的硬币拼出更小的面值)
- 转移方程
f[x]=min{f[x-2]+1,f[x-5]+1,f[x-7]+1}
- 初始条件和边界情况
f[0]=0;如果不能拼出X,X=正无穷;
- 计算顺序
f[0],f[1],f[2];
硬币的面值 A[] = { 2,5,7,..... }, 要拼出的钱数 M = 27;
public int coin(int[]A, int M) {
int[]f = new int[M + 1];
int n = A.length();
f[0] = 0;
for (int i = 1; i <= M; i++) {
f[i] = MAX_INT;
for (int j = 0; j < n; j++) {
if (f >= A[j] && f[i - A[j] != MAX_INT) {
f[i] = min(f[i - A[j] + 1, f[i]]);
}
}
}
if (f[M] == MAX_INT) {
f[M] = -1;
}
reurn f[M];
}
标签:硬币,int,MAX,min,拼出,INT,动态,规划,DP 来源: https://blog.51cto.com/u_15260724/2879012