论文查重入口服务承诺严格遵守文献保密规定,用户送检文献仅用作检测分析,无其他商业运作行为,保障用户送检文献及检测报告的使用安全!
该文章是文章相似度类有关的方法,对您的论文查抄袭有指导价值。
一、Python之动态规划算法
动态规划算法中是将复杂问题递归分解为子问题,通过解决这些子问题来解决复杂问题。与递归算法相比,动态编程减少了堆栈的使用,避免了重复的计算,效率得到显著提升。
先来看一个简单的例子,斐波那契数列。
斐波那契数列的定义如下。
斐波那契数列可以很容易地用递归算法实现。
上述代码,随着n的增加,计算量呈指数级增长,算法的时间复杂度是 。
采用动态规划算法,通过自下而上的计算数列的值,可以使算法复杂度减小到 ,代码如下。
下面我们再看一个复杂一些的例子。
这是小学奥数常见的硬币问题: 已知有1分,2分,5分三种硬币数量不限,用这些硬币凑成为n分钱,那么一共有多少种组合方法。
我们将硬币的种类用列表 coins 定义;
将问题定义为一个二维数组 dp,dpamtj 是使用 coins 中前 j1 种硬币( coins0:j1 )凑成总价amt的组合数。
例如: coins = 1,2,5 。
dp51 就是使用前两种硬币 1,2 凑成总和为5的组合数。
对于所有的 dp0j 来说,凑成总价为0的情况只有一种,就是所有的硬币数量都为0。所以对于在有效范围内任意的j,都有 dp0j 为1。
对于 dpamtj 的计算,也就是使用 coins0:j1 硬币总价amt的组合数,包含两种情况计算。
1.当使用第j个硬币时,有 dpamtcoinsjj 种情况,即amt减去第j个硬币币值,使用前j1种硬币的组合数。
2.当不使用第j个硬币时,有 dpamtj1 种情况,即使用前j种硬币凑成amt的组合数。
所以: dpamtj = dpamt coinsjjdpamtj1 。
我们最终得到的结果是:dpamount1。
上述分析省略了一些边界情况。
有了上述的分析,代码实现就比较简单了。
动态规划算法代码简洁,执行效率高。但是与递归算法相比,需要仔细考虑如何分解问题,动态规划代码与递归调用相比,较难理解。
我把递归算法实现的代码也附在下面。有兴趣的朋友可以比较一下两种算法的时间复杂度有多大差别。
上述代码在Python 3.7运行通过。
二、动态规划求背包问题伪代码讲解
开一个bool数组f,fij表示是否可以用前i件物品[刚好]占用j的容量,初始化f0..n
1..s=false,f00=true。然后:
for i=1 to n
for j=wi to s
fij=fi1j or fi1jwi;
最后输出结果只需看fns是否为true,为true则存在可行解,否则不存在。
输出解集的方法就是再开一个数组g,gij记录当前位是选择了物品i还是没有选择物品i,这样完整的代码如下:
DP
for i=1 to n
for j=wi to s
if fi1j==true
fij=true,gij=false;
else if fi1jwi==true
fij=true,gij=true;
output
j=s;i=n;
while i>=1
{
if gij==true
输出物品i,j=jwi,i=i1;
else
不用输出物品i,i=i1;
}
不知道您能不能看懂,输出解集部分跟普通的01背包是一样的,建议您参考背包九讲,如果认为我写的不清楚欢迎提问。希望能帮到您。
三、用动态规划法求两个字符串X=acbccb和Y=cacaca的最长公共子序列
设字符串x的长度为nx,字符串y的长度为ny,可新建二维数组dpnx1ny1。
dpij表示x的前i个字符x0:i1与y的前j个字符y0:j1之间最长公共子序列的长度。
那么边界情况当i==0或j==0时,dpij=0。
对于dpij,若xi1==yj1,在它们之前最长公共子序列dpi1j1的基础上。
再加上当前1个字符,即为新的最长公共子序列的长度,所以dpij=dpi1j11。
若xi1!=yj1,则当前最长公共子序列的长度,继承自之前最长公共子序列的长度。
即要么是dpi1j,要么是dpij1,取两者较大值即可。
令i从1遍历到nx,j从1遍历到ny,根据以上递推关系即可得出dp数组的每个元素。
最终dpnxny即为nx长的字符串x与ny长的字符串y之间最长公共子序列的长度。
因为遍历了二维数组的所有元素,所以算法的时间复杂度为O(nxny)。
具体的C代码和运行结果如下。
所给两个字符串的最长公共子序列应为"abcaa",长度为5,与输出结果相符,望采纳。
附源码。
#include <iostream>。
#include <string>。
using namespace std。
int main() {。
string x = "acbccbaa", y = "cabbcaca"。
int nx = x.length(), ny = y.length()。
int dpnx 1ny 1; 保存最长公共子序列长度。
for (int i = 0; i <= nx; i)。
dpi0 = 0; 边界赋值。
for (int j = 0; j <= ny; j)。
dp0j = 0; 边界赋值。
for (int i = 1; i <= nx; i) {。
for (int j = 1; j <= ny; j) {。
if (xi 1 == yj 1)。
dpij = dpi 1j 1 1。
else。
dpij = max(dpi 1j, dpij 1)。
}。
}。
cout << dpnxny << endl; 结果输出。
return 0。
}。
四、求用动态规划的方法求解简单的整数规划问题的matlab程序或者C程序代码,高手们帮帮忙
max Z=4x15x2 6x3
s.t. 3x14x25x3<=10
x1,x2,x3>=0且都为整数
约束条件分析:
x1=1,2,3
x2=1,2
x3=1,2
阶段变量:x1.x2.x3
状态变量:
决策变量:
目标函数:Z=4x15x2 6x3
状态转移方程:
约束条件用惩罚处理
等未完待续等。
此文结论,该文是关于学术不端查重的技巧,免费阅读,为您的检测提供有关的解惑。