使用记忆化在 C++ 中实现 Knapstack
Knapstack implementation in c++ using memoization
执行 int t[102][1002] = {-1};
vs 运行 for 循环和执行
之间有什么区别
for(int i = 0; i < 102; i++)
for(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);
}
这只会将二维数组 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;
这个你已经知道了。
其他方法是使用 memset 函数。
memset(t, -1, sizeof(t));
正如其他人所说,您只是将第一个元素设置为 -1。我将提供更多的 C++11 替代 memset。如果您使用 -O2 编译器优化选项,性能应该非常相似。
std::fill_n(&t[0][0], sizeof(t)/sizeof(int),-1);
编辑:拼写错误
执行 int t[102][1002] = {-1};
vs 运行 for 循环和执行
for(int i = 0; i < 102; i++)
for(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);
}
这只会将二维数组 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;
这个你已经知道了。
其他方法是使用 memset 函数。
memset(t, -1, sizeof(t));
正如其他人所说,您只是将第一个元素设置为 -1。我将提供更多的 C++11 替代 memset。如果您使用 -O2 编译器优化选项,性能应该非常相似。
std::fill_n(&t[0][0], sizeof(t)/sizeof(int),-1);
编辑:拼写错误