标签: dynamic-programming

盒子塔(堆叠立方体)

我上周完成了这个任务,但找不到一个好的算法来解决这个问题.所以这里是描述:

您可以通过不将较大的立方体放置到较小的立方体上来构建具有建筑立方体的稳定塔,并且如果不将较硬的立方体放入较轻的立方体中.制作一个程序,为您提供具有n个立方体的最高塔.
输入:
在in.txt的第一行中有多维数据集的数量n(1 = <n = <1000).下面的n行包括两个正整数,一个立方体的边长和重量(它们都不高于2000)没有相似的立方体,其中sidelength和wieght是相同的
输出:
你必须把最高稳定塔的m号写入out.txt.进入第二行,您必须从塔底到顶部写入塔的序数m.根据塔的高度,我们指的是所有立方体的边长(而不是立方体的数量).如果有多个解决方案,您可以
为输入和输出提供您想要的任何示例:
输入:
5
10 3
20 5
15 6
15 1
10 2
和输出:
3
2 1 5
这里是程序的限制.时间限制:0.2秒.内存限制:16 Mb

我希望你能帮助我解决这个问题.thx所有的帮助

algorithm dynamic-programming

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

为什么我仍然使用尾递归Fibonacci算法烧掉堆栈?

堆栈在n = 1000之前溢出.是因为对long []参数的引用,JVM感觉需要保持每个堆栈帧(疯狂猜测),还是我做错了什么?

    public static void main(String[] args) {
        long start = System.currentTimeMillis();
        fibonacciMemoized(1000);
        long end = System.currentTimeMillis();
        System.out.println("\nTotal run time: " + (end-start));
    }

    public static void fibonacciMemoized(int n) {
        long[] fibMemos = new long[n+1];
        for (int i = 0;  i < fibMemos.length; i++) {
            fibMemos[i] = Long.MAX_VALUE;
        }
        long fibResult = fib(n, 1, 0, fibMemos);
        System.out.println(fibResult);
    }

    public static long fib(int n, long fibAcc, long fibPrev, long[] fibMemos) {
        if (fibMemos[n] != Long.MAX_VALUE){
            return fibMemos[n];
        } else …
Run Code Online (Sandbox Code Playgroud)

java stack-overflow tail-recursion memoization dynamic-programming

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

动态规划与分治的区别

分而治之和动态编程的主要区别是什么?如果我们举一个例子,合并排序基本上是通过使用递归的分而治之来解决的.动态编程也是基于递归,而不是为什么Merge sort被认为是动态编程的一个例子呢?

algorithm dynamic-programming divide-and-conquer

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

在背包中获取对象列表

我有一个与0-1背包类似的问题。

我试图做的修改是获取所选对象的列表,而不是成本。我尝试使用以下代码:

public static int fillPackage(double weight,ArrayList<Item> item, int n) {
    //base case
    if(n == 0 || weight == 0)
        return 0;

    if(item.get(n - 1).getWeight() > weight)
        return fillPackage(weight, item, n - 1);    

    else {
        int include_cost = item.get(n - 1).getCost() + fillPackage((weight - item.get(n - 1).getWeight()), item, n - 1);
        int exclude_cost = fillPackage(weight, item, n - 1);
        if(include_cost > exclude_cost) {
            my_pack.add(item.get(n - 1));
            return include_cost;
        }
        else {
            return exclude_cost;
        }
    }   
}
Run Code Online (Sandbox Code Playgroud)

my_pack …

java algorithm arraylist knapsack-problem dynamic-programming

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

无法理解代码段的流程

我很难理解下面的代码.它用可用面额的硬币('硬币')计算赚钱金额('n')的方法数量

def change(n, coins_available, coins_so_far):
    if sum(coins_so_far) == n:
        yield coins_so_far
    elif sum(coins_so_far) > n:
        pass
    elif coins_available == []:
        pass
    else:
        for c in change(n, coins_available[:], coins_so_far+[coins_available[0]]):
            yield c
        for c in change(n, coins_available[1:], coins_so_far):
            yield c

n = 15
coins = [1, 5, 10, 25]

solutions = [s for s in change(n, coins, [])]
for s in solutions:
    print s
Run Code Online (Sandbox Code Playgroud)

输出:

[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[1, 1, …
Run Code Online (Sandbox Code Playgroud)

python recursion dynamic-programming np

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

原始计算器的动态编程

我正在处理这个问题,这与改变硬币问题很相似.

我需要实现一个简单的计算器,它可以用当前数字x执行以下三个操作:乘以x乘以2,将x乘以3,或者将x加1.

目标给出正整数n,找到从数字1开始获得数字n所需的最小操作数.

我做了一个贪婪的方法,它显示不正确的结果

import sys

def optimal_sequence(n):
    sequence = []
    while n >= 1:
        sequence.append(n)
        if n % 3 == 0:
            n = n // 3
        elif n % 2 == 0:
            n = n // 2
        else:
            n = n - 1
    return reversed(sequence)

input = sys.stdin.read()
n = int(input)
sequence = list(optimal_sequence(n))
print(len(sequence) - 1)
for x in sequence:
    print(x)
Run Code Online (Sandbox Code Playgroud)

例如:

Input: 10
Output: 
4
1 2 4 5 10
Run Code Online (Sandbox Code Playgroud)

4个步骤.但正确的是3个步骤:

Output: 
3
1 3 9 10 …
Run Code Online (Sandbox Code Playgroud)

python dynamic-programming greedy

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

如何使用字符串索引在php中动态创建数组

我有一个像这样的字符串:

$str = "eat.fruit.apple.good";
Run Code Online (Sandbox Code Playgroud)

我要像这样使用这个数组:

$arr["eat"]["fruit"]["apple"]["good"] = true;
Run Code Online (Sandbox Code Playgroud)

但我不明白如何动态创建它.谢谢戴维德

php arrays dynamic-programming

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

最大化两个数字之和加上它们之间的距离

我们给出方数矩阵,例如

1 9 2
3 8 3
2 1 1
Run Code Online (Sandbox Code Playgroud)

相邻数字之间的距离是2.我们希望在同一行或同一列中找到这样的两个数字,它们的总和加上它们之间的距离是最大的.例如,在上面的示例中,这些数字是98,并且最大结果是9+8+1*2 = 19.我们想要找到最大的结果,我们不需要具体的数字.

对我来说这看起来像是一个DP问题,但我想不出任何优雅的解决方案.

algorithm dynamic-programming

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

背包C#实现任务

我正在尝试用给定条件编写背包c#算法,但我遇到的问题总是存在两个问题.我得到"索引超出了数组的范围"错误或我的结果只是0.

我找到了几个Knapsack实现的代码示例,但是我无法弄清楚我做错了什么.

代码示例:https: //www.programmingalgorithms.com/algorithm/knapsack-problem

http://www.csharpstar.com/csharp-knapsack-problem/

我的代码:

static int Knapsack(int n, int w, int[] s, int[] v)
{
    int[,] G = new int[n+1,w+1];
    for (int k = 0; k <= n; k++)
    {
        for (int r = 0; r < w; r++)
        {
            if (r == 0 || k == 0)
                G[k, r] = 0;
            else if (s[k] <= r)
                G[k, r] = Math.Max(G[k- 1, r], v[k] + G[k - 1, r - s[k]]);
            else
                G[k, r] = G[k …
Run Code Online (Sandbox Code Playgroud)

c# knapsack-problem dynamic-programming

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

数组的最小和分区

问题陈述:

给定一个数组,任务是将其分为两组S1和S2,以使它们的和之间的绝对差最小。

采样输入

[1,6,5,11]=> 1。2个子集为{1,5,6}{11},总和为1211。因此答案是1

[36,7,46,40]=> 23。2个子集为{7,46}{36,40},总和为5376。因此答案是23

约束条件

1 <=数组大小<= 50

1 <= a [i] <= 50

我的努力:

int someFunction(int n, int *arr) {
    qsort(arr, n, sizeof(int), compare);// sorted it for simplicity
    int i, j;
    int dp[55][3000]; // sum of the array won't go beyond 3000 and size of array is less than or equal …
Run Code Online (Sandbox Code Playgroud)

c algorithm dynamic-programming

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