动态规划(DP)

动态规划

  1. 计数
    有多少种方式走到右下角
    有多少种方法选出 K 个数使得和是 m

  2. 求最大最小值
    从左上角走到右下角路径的最大数字和
    最长上升子序列

  3. 求存在性
    取石子游戏
    能不能选出 K 个数使得和是 m


  1. 确定状态
			最后一步(最优策略中使用的最后一枚硬币)
 			化成子问题(最少的硬币拼出更小的面值)
  1. 转移方程
		f[x]=min{f[x-2]+1,f[x-5]+1,f[x-7]+1}
  1. 初始条件和边界情况
		f[0]=0;如果不能拼出X,X=正无穷;
  1. 计算顺序
		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];
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ac1011_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值