Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Eulers项目问题345无法理解几行代码_C++_Recursion_Dynamic Programming - Fatal编程技术网

C++ Eulers项目问题345无法理解几行代码

C++ Eulers项目问题345无法理解几行代码,c++,recursion,dynamic-programming,C++,Recursion,Dynamic Programming,我在理解下面的代码时遇到问题。我已在我不理解的部分标上//注释 递归调用函数“search()”。MaxRemaining[]数组有15个元素,大小是一个值为15的常量 const unsigned int Size = 15; unsigned short matrix[Size][Size] = { { 7, 53, 183, 439, 863, 497, 383, 563, 79, 973, 287, 63, 343, 169, 583 }, { 627,

我在理解下面的代码时遇到问题。我已在我不理解的部分标上//注释

递归调用函数“search()”。MaxRemaining[]数组有15个元素,大小是一个值为15的常量

const unsigned int Size = 15;


unsigned short matrix[Size][Size] =
  {
    {   7,  53, 183, 439, 863, 497, 383, 563,  79, 973, 287,  63, 343, 169, 583 },
    { 627, 343, 773, 959, 943, 767, 473, 103, 699, 303, 957, 703, 583, 639, 913 },
    { 447, 283, 463,  29,  23, 487, 463, 993, 119, 883, 327, 493, 423, 159, 743 },
    { 217, 623,   3, 399, 853, 407, 103, 983,  89, 463, 290, 516, 212, 462, 350 },
    { 960, 376, 682, 962, 300, 780, 486, 502, 912, 800, 250, 346, 172, 812, 350 },
    { 870, 456, 192, 162, 593, 473, 915,  45, 989, 873, 823, 965, 425, 329, 803 },
    { 973, 965, 905, 919, 133, 673, 665, 235, 509, 613, 673, 815, 165, 992, 326 },
    { 322, 148, 972, 962, 286, 255, 941, 541, 265, 323, 925, 281, 601,  95, 973 },
    { 445, 721,  11, 525, 473,  65, 511, 164, 138, 672,  18, 428, 154, 448, 848 },
    { 414, 456, 310, 312, 798, 104, 566, 520, 302, 248, 694, 976, 430, 392, 198 },
    { 184, 829, 373, 181, 631, 101, 969, 613, 840, 740, 778, 458, 284, 760, 390 },
    { 821, 461, 843, 513,  17, 901, 711, 993, 293, 157, 274,  94, 192, 156, 574 },
    {  34, 124,   4, 878, 450, 476, 712, 914, 838, 669, 875, 299, 823, 329, 699 },
    { 815, 559, 813, 459, 522, 788, 168, 586, 966, 232, 308, 833, 251, 631, 107 },
    { 813, 883, 451, 509, 615,  77, 281, 613, 459, 205, 380, 274, 302,  35, 805 }
  };



unsigned int maxRemaining[Size];
unsigned int search(unsigned int row = 0, unsigned int columnMask = 0,unsigned int sum = 0, unsigned int atLeast = 0){
    if (row == Size)
        return sum;

    if (sum + maxRemaining[row] <= atLeast) //explain this line
        return 0;

    for (unsigned int column = 0; column < Size; column++)
    {
        auto mask = 1 << column;         //explain this line
        if ((columnMask & mask) != 0)    //explain this line
            continue;
        auto current = search(row + 1, columnMask | mask, sum + matrix[row][column], atLeast);  //explain whats with the 2nd parameter.
        if (atLeast < current)
            atLeast = current;
    }

    return atLeast;
}
const unsigned int Size=15;
无符号短矩阵[大小][大小]=
{
{   7,  53, 183, 439, 863, 497, 383, 563,  79, 973, 287,  63, 343, 169, 583 },
{ 627, 343, 773, 959, 943, 767, 473, 103, 699, 303, 957, 703, 583, 639, 913 },
{ 447, 283, 463,  29,  23, 487, 463, 993, 119, 883, 327, 493, 423, 159, 743 },
{ 217, 623,   3, 399, 853, 407, 103, 983,  89, 463, 290, 516, 212, 462, 350 },
{ 960, 376, 682, 962, 300, 780, 486, 502, 912, 800, 250, 346, 172, 812, 350 },
{ 870, 456, 192, 162, 593, 473, 915,  45, 989, 873, 823, 965, 425, 329, 803 },
{ 973, 965, 905, 919, 133, 673, 665, 235, 509, 613, 673, 815, 165, 992, 326 },
{ 322, 148, 972, 962, 286, 255, 941, 541, 265, 323, 925, 281, 601,  95, 973 },
{ 445, 721,  11, 525, 473,  65, 511, 164, 138, 672,  18, 428, 154, 448, 848 },
{ 414, 456, 310, 312, 798, 104, 566, 520, 302, 248, 694, 976, 430, 392, 198 },
{ 184, 829, 373, 181, 631, 101, 969, 613, 840, 740, 778, 458, 284, 760, 390 },
{ 821, 461, 843, 513,  17, 901, 711, 993, 293, 157, 274,  94, 192, 156, 574 },
{  34, 124,   4, 878, 450, 476, 712, 914, 838, 669, 875, 299, 823, 329, 699 },
{ 815, 559, 813, 459, 522, 788, 168, 586, 966, 232, 308, 833, 251, 631, 107 },
{ 813, 883, 451, 509, 615,  77, 281, 613, 459, 205, 380, 274, 302,  35, 805 }
};
无符号整数maxlaining[Size];
无符号整数搜索(无符号整数行=0,无符号整数列掩码=0,无符号整数和=0,无符号整数至少=0){
如果(行==大小)
回报金额;

如果(sum+maxlaining[row],我将尝试解释您突出显示的行。让我们从解释
columnMask
参数开始-此参数是所有使用列的位掩码。显然,此掩码最初为0。下一步:


auto-mask=1由于函数
search()
的多次递归调用,调试此代码并不容易

但是,您可以通过仔细查看以下问题来理解代码:

我们将矩阵的矩阵和定义为矩阵元素的最大和,每个元素是其行和列中唯一的元素。例如,下面矩阵的矩阵和等于3315(=863+383+343+959+767):

  • 该问题要求您查找最大和,仅以每个元素是其行和列中唯一选定的元素为准。因此,如果在第一行中,函数在第一列中选择一个元素,则对于第二行,函数必须在除第一列之外的所有列中选择一个元素。您必须想象
    列n掩码
    作为由15位组成的位字符串,其中最低有效位为第一列,最高有效位为最后一列:

< > >代码>自动掩码=1,你的问题到底是什么?A*的**是什么?如果你不理解某些代码是如何工作的,最好的解决方法是使用你的调试器一次执行一行,并逐步观察它的逻辑。你试过在调试器中运行这个程序吗?如果没有,为什么不呢?是C++还是你不理解的算法?我们可以帮助你使用C++的含义和语法,但可能不是算法用来解决具体问题。我已经编辑了注释并尝试重新格式化。请看现在的很多谢谢,你的解释对我帮助很大。BTW Max St留空只是一个一维数组,包含了来自MA的元素15。trix在任何列中都是最高值。似乎我理解了
maxlaining
正在做什么,并相应地更新了我的答案。请看。
if ((columnMask & mask) != 0)
    continue;
auto current = search(row + 1, columnMask | mask, sum + matrix[row][column], atLeast);
  7  53 183 439 863
497 383 563  79 973
287  63 343 169 583
627 343 773 959 943
767 473 103 699 303 
column index: 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
column mask:  0  0  0  0  0  0 0 0 0 0 0 0 0 0 1  
column index: 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
mask:         0  0  0  0  0  0 0 0 0 0 0 1 0 0 0