淘宝开放平台怎么做淘宝客网站,微信开发平台公司,wordpress和discuz双向同步,中国核工业第五建设有限公司招聘信息听说过动态规划#xff08;DP#xff09;的同学应该都知道有背包问题的存在。 首先我们来了解一下动态规划 基本思想#xff1a; 动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中#xff0c; 可能会有很多可行解。没一个解都对应于一个值#xff0c;我们希…听说过动态规划DP的同学应该都知道有背包问题的存在。 首先我们来了解一下动态规划 基本思想 动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中 可能会有很多可行解。没一个解都对应于一个值我们希望找到具有最优值的解。胎动规划算法与分治法类似其基本思想也是将待求解问题分解为若干个子问题先求解子问题然后从这些子问题的解得到原问题的解。与分治法不同的是适用于动态规划算法求解的问题经分解得到的子问题往往不是互相独立的。若用分治法来解这类问题则分解得到的子问题数目太多有些子问题被重复计算很多次。如果我们能保存已解决子问题的答案而在需要时再找出已求得的答案这样就可以避免大量的重复计算节省时间。我们可以用一个表来记录所有已解决的子问题的答案。不管该子问题以后是否被用到只要它被计算过就将其结果填入表中。这就是动态规划算法的基本思路。具体的动态规划算法多种多样但它们具有相同的填表格式。 与分治法最大的差别是适用于动态规划求解的问题经分解后得到的子问题往往不是互相独立的即下一个子阶段的求解是建立在上一个子阶段的解的基础上进行进一步的求解 应用场景 适用于动态规划的问题必须满足最优化原理、无后效性和重叠性。 (1) 最优化原理最优子结构性质一个最优化策略具有这样的性质不论过去状态和决策如何对前面的决策所形成的状态而言余下的决策必须构成最优策略。简而言之一个最优化策略的子策略总是最优的。一个问题满足最优化原理又称其具有最优子结构性质。 (2) 无后效性将各阶段按照一定的次序排列好之后对于某个给定的阶段状态它以前各阶段的状态无法直接影响它未来的决策而只能通过当前的这个状态。换句话说每个状态都是过去历史的一个完整总结。这就是无后向性又称无后效性。 (3) 子问题的重叠性动态规划将原来具有指数级时间复杂度的搜索算法改进成了具有多项式时间复杂度的算法。其中的关键在于解决冗余这就是动态规划算法的根本目的。动态规划实质上是一种以空间换时间的技术它在实现的过程中不得不存储产生过程中的各种状态所以它的空间复杂度要大于其他算法。 接下来看背包问题嗯听起来就很朴素。 其实背包问题也很简单无非就是在容器一定的情况下往里面塞东西但是容器的容量有限总不能把它撑爆吧那不就弄巧成拙了所以我们要把利益和效率最大化。在容器容量一定的情况下根据物体的体积质量等条件来判断如何装才能使容器内所存物体的价值最大。这就用到了背包问题。 首先我们来看的是01背包问题 01背包指在容器容量一定下每种物品只有一个告诉你他们的体积或者其它条件以及价值来使价值最大化。 代码优化后为二重循环 #includecstring
#includeiostream
#includealgorithm
using namespace std;
int total_weight,wp_weight,every_jz;
int main() {cintotal_weight;int dp[total_weight];memset(dp,0,sizeof(dp));cinwp_weight;int w[wp_weight],v[wp_weight];for(int i1;iwp_weight;i)cinw[i];for(int i1;iwp_weight;i)cinv[i];for (int i 1; i wp_weight; i)for (int j total_weight; j w[i] ; j--)dp[j] max(dp[j], dp[j - w[i]] v[i]);cout 总的价值为: dp[total_weight] endl;return 0;
} View Code 进一步的我们再来看一下完全背包问题 完全背包指在容器容量一定下每种物品有无数件告诉你他们每种分别的体积或者其它条件价值力求价值最大化。 代码优化后为二重循环 #includecstring
#includeiostream
#includealgorithm
using namespace std;
int total_weight,wp_weight,every_jz;
int main() {cintotal_weight;int dp[total_weight];memset(dp,0,sizeof(dp));cinwp_weight;int w[wp_weight],v[wp_weight];for(int i1;iwp_weight;i)cinw[i];for(int i1;iwp_weight;i)cinv[i];for (int i 1; i wp_weight; i)for (int j w[i]; j total_weight ; j)dp[j] max(dp[j], dp[j - w[i]] v[i]);cout 总的价值为: dp[total_weight] endl;return 0;
} View Code 最后我们来看一下多重背包问题 即容器容量一定下每种物品有固定件数告诉你他们每种分别的体积或者其它条件价值自然还是令价值最大化。 代码 #includeiostream
#includecstring
#includealgorithm
using namespace std;
int total_weight,w_weight;
int main() {cintotal_weightw_weight;int w[w_weight],v[w_weight],cot[w_weight],dp[total_weight1];memset(dp,0,sizeof(dp));for (int i 1; i w_weight; i)for (int k 1; k cot[i]; k)for (int j total_weight; j w[i]; j--)dp[j] max(dp[j], dp[j - w[i]] v[i]);cout 总的价值为: dp[total_weight] endl;return 0;
} View Code 别丧气你现在只是单身了十几年以后你还会单身好久呢。转载于:https://www.cnblogs.com/GTBD/p/9215470.html