Javascript 这是动态规划还是分而治之? 我正在学习算法。我读过一篇文章,间接地讨论了背包问题。最后,据说它是用动态规划来解决的,但对我来说,它看起来就像是用小优化来分而治之。有人能看一下吗? 我已将代码粘贴到一个垃圾箱中
动态规划需要一些记忆或表格格式正确吗?我非常喜欢斯基纳在《算法设计手册》一书中描述动态规划的方式。“动态规划是一种通过存储部分结果来有效实现递归算法的技术”Javascript 这是动态规划还是分而治之? 我正在学习算法。我读过一篇文章,间接地讨论了背包问题。最后,据说它是用动态规划来解决的,但对我来说,它看起来就像是用小优化来分而治之。有人能看一下吗? 我已将代码粘贴到一个垃圾箱中,javascript,algorithm,Javascript,Algorithm,动态规划需要一些记忆或表格格式正确吗?我非常喜欢斯基纳在《算法设计手册》一书中描述动态规划的方式。“动态规划是一种通过存储部分结果来有效实现递归算法的技术” 这里有一个递归算法,但不存储部分结果。所以它不是动态规划。但是,通过存储和重用部分结果,它可能会变成一个动态规划算法。我认为这既不是动态规划,也不是分而治之。这只是一个递归算法,用于生成和查找作业子集,它比最大xp占用的时间更少。感谢您的响应。想了想,我也明白了为什么不是分而治之。另外,根据xp计算,这是一个O(n*2^n)时间算法,对吗?
这里有一个递归算法,但不存储部分结果。所以它不是动态规划。但是,通过存储和重用部分结果,它可能会变成一个动态规划算法。我认为这既不是动态规划,也不是分而治之。这只是一个递归算法,用于生成和查找作业子集,它比最大xp占用的时间更少。感谢您的响应。想了想,我也明白了为什么不是分而治之。另外,根据xp计算,这是一个O(n*2^n)时间算法,对吗?而不是O(n*nT)算法,不是时间。问题应该用动态规划来解决,但你提供的代码并不能做到这一点。您粘贴的代码只是测试所有的可能性,以找到最好的一个。这种方法被称为“暴力”或“穷举搜索”。
const ACTIVITIES = [
{name: 'side-project', time: 10, xp: 12},
{name: 'algorithms', time: 3, xp: 7},
{name: 'networking', time: 1, xp: 0.5},
{name: 'exercise', time: 2, xp: 1.5},
{name: 'systems design', time: 4, xp: 4},
{name: 'making CSS codepens', time: 3, xp: 4}
];
const findJob = function(time, activities) {
const optimalSolution = function(items, n = items.length, timeLeft = time) {
if (n === 0 || timeLeft === 0) {
return [];
}
if (items[n - 1].time > timeLeft) {
return optimalSolution(items, n - 1, timeLeft);
}
const lastItem = items[n - 1];
const withLastItem = [
lastItem,
...optimalSolution(items, n - 1, timeLeft - lastItem.time)
];
const withoutLastItem = optimalSolution(items, n - 1, timeLeft);
if (totalXp(withLastItem) > totalXp(withoutLastItem)) {
return withLastItem;
} else {
return withoutLastItem;
}
};
const totalXp = arr => arr.reduce((total, ea) => total + ea.xp, 0);
const sortedByTime = activities
.slice()
.sort((a, b) => a.time - b.time);
return optimalSolution(sortedByTime)
.map(act => act.name);
};