C++ Knapstack在c+中的实现+;使用回忆录

C++ Knapstack在c+中的实现+;使用回忆录,c++,c++11,dynamic-programming,memoization,knapsack-problem,C++,C++11,Dynamic Programming,Memoization,Knapsack Problem,做intt[102][1002]={-1}之间有什么区别vs运行for循环并执行 for(int i = 0; i < 102; i++) for(int j = 0; j < 1002; j++) t[i][j] = -1; for(int i=0;i

intt[102][1002]={-1}之间有什么区别vs运行for循环并执行

for(int i = 0; i < 102; i++)
        for(int j = 0; j < 1002; j++)
            t[i][j] = -1;
for(int i=0;i<102;i++)
对于(int j=0;j<1002;j++)
t[i][j]=-1;
使用前一种方法时,下面的代码不起作用。它只在我循环并初始化时起作用。为什么呢

#include<bits/stdc++.h>
using namespace std;
int t[102][1002] = {-1};
int knapstack(int wt[], int val[], int w, int n)
{
    if(n == 0 || w == 0)
        return 0;

    if (t[n][w] != -1)
        return t[n][w];

    if(wt[n-1] <= w ){
        t[n][w] = max(val[n-1] + knapstack(wt,val, w - wt[n-1],n-1) , knapstack(wt, val, w, n-1));
        return t[n][w];
    }

    if(wt[n-1] > w){
       t[n][w] = knapstack(wt,val,w,n-1); 
       return t[n][w];
    }
}

int main()
{
    int wt[] = {10, 20, 30};
    int val[] = { 60, 100, 120};
    int w = 50, n = sizeof(val)/sizeof(val[0]);
    cout<< knapstack(wt, val, w, n);
}

#包括
使用名称空间std;
int t[102][1002]={-1};
整型背包(整型wt[],整型val[],整型w,整型n)
{
如果(n==0 | | w==0)
返回0;
如果(t[n][w]!=-1)
返回t[n][w];
if(wt[n-1]w){
t[n][w]=背包(wt,val,w,n-1);
返回t[n][w];
}
}
int main()
{
int wt[]={10,20,30};
int val[]={60100120};
int w=50,n=sizeof(val)/sizeof(val[0]);

cout这仅将2D数组的第一个单元格
t
设置为
-1

int t[102][1002] = {-1};
最好使用这两种方法中的任何一种

for(int i = 0; i < 102; i++)
        for(int j = 0; j < 1002; j++)
            t[i][j] = -1;


正如其他人所说,您只需将第一个元素设置为-1。我将提供一个更多的C++11替代memset。如果使用-O2编译器优化选项,性能应该非常相似

std::fill_n(&t[0][0], sizeof(t)/sizeof(int),-1);

编辑:对于输入错误

以及当您使用调试器运行程序时,您看到了什么?这正是调试器的用途。如果您不知道如何使用调试器,这是一个很好的机会,可以学习如何使用调试器一次运行一行程序,监视所有变量及其值的变化,并分析程序的lo知道如何使用调试器是每个C++开发者所需的技能,没有例外。在调试器的帮助下,你应该能够快速找到你编写的这个程序和所有未来程序中的所有bug,而不必向任何人求助。<代码> int [102 ] [1002 ]={-1 }。
没有做你认为它能做的事。我也试过
memset(t,-1,sizeof t);
它说它需要类型转换?好的,我在int main()函数中运行了一个for循环``for(int I=0;I<102;I++)for(int j=0;j<1002;j++)t[I][j]=-1;```,它成功了。我将改变这个问题。声明
t之间的区别是什么[102][1002]={-1}
并使用for循环执行此操作?
std::fill_n(&t[0][0], sizeof(t)/sizeof(int),-1);