我有难以理解为什么使用动态编程的0/1背包不是多项式时间可解决的.这里也提出了类似的问题.为什么背包问题是伪多项式?.有人给出了解释,但我仍然不明白为什么我们应该考虑权重输入的二进制表示.怎么样的n,如果用二进制表示法考虑,我可以说它是对项目数量的指数吗?类似地,对于任何其他多项式时间算法,我可以声称它们具有指数时间复杂度,因为每个输入在计算机中以二进制数字表示.我知道我错了.有人可以通过简单易懂的方式指出原因吗?提前致谢.
目前我正在研究ac框架,我想在其中嵌入一个c ++包.但是,发生了很多命名冲突.所以我决定在C++源代码中添加一个命名空间.现在的问题是我应该在namespace {}块中移动#include"header.h"吗?我只花了一些时间来弄清楚由以下代码产生的错误.
原始C++源码
在啊
#include <unistd.h>
struct File
{
void func(int fd);
};
Run Code Online (Sandbox Code Playgroud)
在a.cpp
#include "a.h"
void File::func(int fd)
{
::close( fd );
}
Run Code Online (Sandbox Code Playgroud)
我添加了这样的命名空间
新啊
namespace MyAddedNameSpace
{
#include <unistd.h>
struct File
{
void func(int fd);
};
}
Run Code Online (Sandbox Code Playgroud)
新的a.cpp
#include "a.h"
namespace MyAddedNameSpace
{
void File::func(int fd)
{
::close( fd );
}
}
Run Code Online (Sandbox Code Playgroud)
编译器抱怨:: close()尚未声明.
我将#include指令放在命名空间块中的原因是因为我导入的c ++包也使用#ifndef标志来包含头文件,如下所示.所以我认为简单的方法是将所有代码放在命名空间块{}中
#ifndef
#include <header1.h>
#include <header2.h>
...
#else
#include <header3.h>
#include <header4.h>
...
#endif
Run Code Online (Sandbox Code Playgroud)
现在我通过在cpp文件中添加额外的行来解决这个问题
#include <unistd.h> //new added line
#include "a.h" …Run Code Online (Sandbox Code Playgroud)