标签: dynamic-programming

看不懂背包解决办法

在维基百科中,背包的算法如下:

for i from 1 to n do  
  for j from 0 to W do  
    if j >= w[i] then  
      T[i, j] := max(T[i-1, j], T[i-1, j-w[i]] + v[i]) [18]  
    else  
      T[i, j] := T[i-1, j]  
    end if  
  end for  
end for  
Run Code Online (Sandbox Code Playgroud)

它与我在网上找到的所有示例的结构相同。
我无法理解的是,这段代码如何考虑到最大值可能来自较小的背包这一事实?例如,如果背包容量为 8,那么最大值可能来自容量 7 (8 - 1)。
我找不到任何逻辑来考虑最大值可能来自较小的背包。这是错误的想法吗?

algorithm recursion knapsack-problem dynamic-programming data-structures

1
推荐指数
1
解决办法
1696
查看次数

修改最小硬币变化

假设你有一张K美元的账单.给出4个有价值的硬币{1,4,6,9}找到硬币的最小数量,其总和为K,当K用二进制表示时,表示输入的长度为log(K)

我尝试过动态编程,但我没弄明白.有没有人知道如何开始解决这个问题?这与背包问题有关,但我无法弄明白.

谢谢.

puzzle algorithm math dynamic-programming

1
推荐指数
1
解决办法
658
查看次数

如何解决 spoj: SCALES - 平衡石头?

这是问题所在:SPOJ - SCALES

我在网上查了一下,在TopCoderAoPS中找到了一些资料,但还是看不懂。请给我一些有关如何解决此问题的更多详细信息!

algorithm dynamic-programming

1
推荐指数
1
解决办法
873
查看次数

在类中展平数组的动态方法?

我正在遍历包含双精度数组的对象.名称已更改.想象一下,这是Lab样本的一个对象,我试图获得Sample对象的平面表示.

从:

Sample
{
    public string Name
    public string Type
    ...
    public double[] RawReadings
}
Run Code Online (Sandbox Code Playgroud)

举例来说:

Name,
RawRead1,
RawRead2,
RawRead3,
...
RawReadn
Run Code Online (Sandbox Code Playgroud)

我如何finangle sample.RawReadings给我数组中的所有n项?我不在乎它的名字与否.

编辑为清晰起见:我希望结果列表中的每个项目都具有Name和类中的属性,与RawReads一样多.我希望结果列表中的每个项目都有一个名称和一个数组 - 这将与我所拥有的相同.

示例LinQ:

from sample in Samples
select new
{
    Name = sample.Name,
    sample.RawReadings
}
Run Code Online (Sandbox Code Playgroud)

这甚至可能吗?

编辑: 我将此提供给第三方API调用,该调用期望"行和列格式".Aspose.Cells ImportCustomObject准确.有可能通过多次调用解决它并手动对齐它们,但这可能很棘手并且容易出错.

c# linq arrays dynamic-programming dynamic-arrays

1
推荐指数
1
解决办法
195
查看次数

确定您是否可以使用每种面额仅使用一次且最多使用 k 个硬币以 N 面额进行找零

这是硬币兑换问题的一个版本。因此,这是一个动态规划问题。

我知道如何确定您是否可以找零,如果您最多可以使用每种面额的一枚硬币,或者您最多可以使用 k 枚硬币,但不能同时使用两者。

algorithm knapsack-problem dynamic-programming coin-change

1
推荐指数
1
解决办法
973
查看次数

Leetcode中的完美广场

我无法理解其中一个Leetcode问题.

给定一个正整数n,找到完全平方数的数量最少(例如,1,4,9,16,...),其总和为n.

例如,给定n = 12,返回3,因为12 = 4 + 4 + 4; 给定n = 13,返回2,因为13 = 4 + 9.

解:

int numSquares(int n) {
    static vector<int> dp {0};
    while (dp.size() <= n) {
        int m = dp.size(), squares = INT_MAX;
        for (int i=1; i*i<=m; ++i)
            squares = min(squares, dp[m-i*i] + 1);
        dp.push_back(squares);
    }
    return dp[n];
}
Run Code Online (Sandbox Code Playgroud)

我真的不明白发生了什么min(squares,dp[m-i*i]+1).你能解释一下吗?

谢谢.

c++ math dynamic-programming perfect-square

1
推荐指数
2
解决办法
924
查看次数

马尔可夫决策过程的转移矩阵必须是随机的吗?

我正在尝试使用值迭代(通过 pymdptoolbox)和 NumPy找到此图中指定的马尔可夫决策过程问题的最佳策略。但是 pymdptoolbox 说我的转换矩阵“不是随机的”。

是不是因为有 [0, 0, 0, 0] 的数组?有些转换是不可能的,比如从状态 1 到状态 3。如果不是用零,我如何表示这些不可能的转换?

我的代码:

import mdptoolbox 
import numpy as np

transitions = np.array([
#action1
    [
            [0.2, 0.8, 0, 0], #s1
            [0, 0, 0, 0], #s2
            [0, 0, 0, 0], #s3
            [0, 0, 0.9, 0.1] #s4
    ],

#action2
    [
            [0.2, 0, 0, 0.8], #s1
            [0, 0.2, 0.8, 0], #s2
            [0, 0, 0, 0], #s3
            [0, 0, 0, 0] #s4
    ],

#action3
    [
            [0, 0, 0, 0], #s1
            [0.8, …
Run Code Online (Sandbox Code Playgroud)

python markov-chains dynamic-programming stochastic mdptoolbox

1
推荐指数
1
解决办法
2574
查看次数

在 R 中使用动态规划计算斐波那契

我尝试编写一个函数来计算 R 中的第 n 个斐波那契数。我可以递归地执行此操作。

fibonacci = function(n){
  if (n == 1) {return(1)}
  if (n == 2) {return(2)}

  return(fibonacci(n - 1) + fibonacci(n - 2))
}
Run Code Online (Sandbox Code Playgroud)

我在 R 中找不到任何示例,但是从其他语言的指南中我想出了以下内容。然而,它似乎并没有运行得更快。

fibonacci = function(n, lookup = NULL){
  if (is.null(lookup)) {
    lookup = integer(n + 1)
  }


  if (n == 1) {return(1)}
  if (n == 2) {return(2)}

  lookup[1] = 1
  lookup[2] = 2

  if (lookup[n - 1] == 0) {
    lookup[n - 1] = fibonacci(n - 1, lookup)
  }

  if (lookup[n - 2] …
Run Code Online (Sandbox Code Playgroud)

recursion r dynamic-programming fibonacci

1
推荐指数
1
解决办法
128
查看次数

是否可以从(a,b)移至(c,d)

问题是输出是否可以从给定点移动(a,b)到目标(c,d)

我们仅限于积极的座标

可能有以下两个动作

(a,b) -> (a+b,b)
(a,b) -> (a,b+a)
Run Code Online (Sandbox Code Playgroud)

例如,(1,1)to (5,4)is True 您可以执行以下操作:使用2nd move 3次,(1,1) -> (1,2) -> (1,3) -> (1,4)使用1st move 1次,(1,4) -> (5,4)

我想出了以下递归方法

def move(a,b,c,d):
    if a==c and b==d:
        return True
    elif a>c or b>d:
        return False
    else:
        ans = False
        if a < c:
            if move(a+b,b,c,d):
                return True
        if b < d:
            if move(a,b+a,c,d):
                return True
    return False
Run Code Online (Sandbox Code Playgroud)

a)我的解决方案是否涵盖所有可能的情况?由于我没有测试用例,因此无法确定,但是我认为我确实考虑了所有因素。

b)我的解决方案的时间复杂度是多少?我认为它是指数的,但不能确定。

c)是否有更好的解决方案(在时间复杂度方面)。我们可以使用动态编程吗?

感谢您的投入。

algorithm recursion dynamic-programming time-complexity

1
推荐指数
1
解决办法
107
查看次数

算法难题:球堆叠问题

我正在尝试解决这个问题:https : //www.urionlinejudge.com.br/judge/en/problems/view/1312

XYZ 电视频道正在开发一个新的游戏节目,参赛者必须做出一些选择才能获得奖品。游戏由一堆三角形的球组成,每个球都有一个整数值,如下例所示。

在此处输入图片说明

参赛者必须选择他要拿的球,他的奖金是这些球价值的总和。但是,只有当参赛者也直接将球拿在它上面时,他才能拿走任何给定的球。这可能需要使用相同的规则来获取额外的球。请注意,参赛者可以选择不拿任何球,在这种情况下,奖品为零。

电视节目导演关心参赛者可以为给定的筹码获得的最高奖金。由于他是你的老板,他不知道如何回答这个问题,所以他把这个任务交给了你。

输入

每个测试用例都使用多行描述。第一行包含一个整数N,表示堆栈的行数(1 ? N ? 1000)。接下来N行的第i 个包含i 个整数B ij (?105 ? B ij ? 105 for 1 ? j ? i ? N );数字B ij是堆栈中第行中j 个球的值(第一行是最上面的一个,如果最左边的是每行内的第一个球)。

最后一个测试用例后面跟着一行包含一个零。

输出

Sample Input  | Sample Output
4             |   7 
3             |   0
-5 3          |   6
-8 2 -8       |
3 9 -2 7      |
2             |
-2            | …
Run Code Online (Sandbox Code Playgroud)

algorithm dynamic-programming

1
推荐指数
1
解决办法
466
查看次数