【白话算法】如何根据动态规划数组求得最佳策略

本文通过背包问题实例,解析如何根据二维动态规划数组dp[N+1][W+1]找出最佳选择方案。关键在于识别使最优价值发生变化的步骤,并通过循环与临时变量追踪当前最佳值,从而确定最优策略。代码实现中,可以利用动态规划的无后效性进行优化,避免重复计算。
摘要由CSDN通过智能技术生成
我们知道,我们可以使用二维数组求得一个DP问题的最佳值,但是并没有求得其最佳方案。

以背包问题为例,如何根据已经求得的二维数组 dp[N+1][W+1] ,求得最佳选择方案呢?

只需要看DP代码,如下:

int dpf[N+1][W+1]; //数组从0开始
int dp_solve()
{
	for(int i=0; i<N;i++)
		for(int j=0; j<=W;j++)
			if(j<w[i])
				dpf[i+1][j]=dpf[i][j];
			else
			    dpf[i+1][j]=max(dpf[i][j],dpf[i][j-w[i]]+v[i]);
	return dpf[N][W];
}

我们可以看到dpf[i+1][j] 进和  dpf[i][j],dpf[i][j-w[i]]+v[i] 两个状态相关。

【规则1】找出添加新步骤的关键条件。

而且,如果和dpf[i][j]相关,那么 最优价值不会变化,所以不会添加新步骤,所以我们只需要考虑  dpf[i][j] ==dpf[i-1][j-w[i-1]]+v[i-1] 的情况。(dpf  从N开始,而w,v数组从 N-1开始往前)

【小结】以上主要找出 使得最优价值发生改变的“那个步骤”,因为只有变化了,说明这个步骤才可能是最优策略里的一步。

【规则2】DP是正向进行的,求最优方案就该从逆向考虑。

写出基本循环:


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值