【问题标题】:C++ Cutting Rod Dynamic programmingC++ 切割棒动态规划
【发布时间】:2015-11-21 16:06:34
【问题描述】:

我是动态编程的新手,并试图解决一个常青的问题:切割棒。我已经尝试了几个小时,但我被卡住了。我正在尝试调试它但没有成功。 这是我的代码

#include <iostream>
#include <cstdlib>
using namespace std;

int main()
{
    int length = 5;
    int peaces[2][4] = {{1, 2, 3, 4}, {2, 5, 7, 8}};
    /*
        length  1, 2, 3, 4
        value:  2, 5, 7, 8  
    */ 

    //create working matrix: number of lengths X lengths
    int work[4][6];
    //fill in the first column with zeros
    for(  int k = 0; k < 5; k++  )
    {
        work[k][0] = 0;
    }
    //fill in the first row with zeroes
    for(  int k = 0; k <= length; k++  )
    {
        work[0][k] = 0;
    }

    for(  int i = 1; i < 5; i++  ) // number of lengths
    {
        cout << endl << " i: " << i << "   " << endl;
        for(  int j = 1; j < 6; j++  )
        {
            cout << endl << " j: " << j << "   " << endl;
            if(  j >= i  )
            {
                work[i][j] = max(  work[i - 1][j], work[i][j - i] + peaces[1][i-1]  );
            }
            else
            {
                work[i][j] = work[i - 1][j];
            }
            cout << endl;<< "inserted:" << work[i][j]<< endl;

            for(  int i = 0; i < 5; i++  )
            {
                for(  int j = 0; j < 6; j++  )
                {
                    cout << work[i][j] << " ";          
                }
                cout << endl;
            }

            cout  <<  endl;
        }
    }



    for(  int i = 0; i < 5; i++  )
    {
        for(  int j = 0; j < 6; j++  )
        {
            cout << work[i][j] << " ";          
        }
        cout << endl;
    }

    return 0;   
};

发生了一些非常奇怪的事情,我不知道为什么:在 for 循环的最后一次迭代中,我得到了正确的解决方案,但是当退出循环并打印 2D 数组时,它发生了变化,与上一次迭代中的一个。在两次打印之间,不对阵列进行任何操作。 我知道这不是一个优化的解决方案,但这是我想出的第一个。 问题:为什么数组没有以正确的方式填充?我做错了什么?

【问题讨论】:

  • 我看到的主要问题是您的第一个维度的数组长度不正确。你有 work[4][6] 并且两次你引用它“for(int k = 0; k
  • 谢谢你的战利品!我使用的第一个数组有 4 行,后来我添加了一个,因为我需要它进行迭代,并且在我定义它时忘记增加行数。所以再次感谢你。我花了很多时间调试但没有成功。我想确保在发布问题之前我已经尝试了所有方法。
  • 这是一个使用std::array 很有用的示例,因为您始终可以获得可用的长度信息,而无需跟踪另一个变量。此外,数组的打印最好在它自己的功能中减少代码重复。
  • 感谢您的提示。我不知道std::array。我将开始使用它。

标签: c++ dynamic-programming


【解决方案1】:

避免此类问题的最佳方法是首先为维度定义变量。例如,

int xlen = 4;
int ylen = 5;
int work[xlen][ylen];

然后,您可以在循环中使用 xlen 和 ylen,如果要更改数组的大小,只需更改 xlen 和 ylen。

或者,您可以使用您在此处找到的答案找到大小:How do I find the length of an array?

最后,您应该阅读标准模板库,它为您提供了可以使用的“更智能”的对象。

【讨论】:

  • 我绝对需要开始学习 STL。我专注于学习数据结构、排序算法和动态编程。现在我发现了解更多关于它们很有用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-05
  • 2014-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-04
相关资源
最近更新 更多