- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我已尝试实现 a bin-packing-type problem 的解决方案, 主要是在途中 described by Dietrich Epp .我还不会用 Haskell,所以我用 C++ 写了一些东西。
对于小于特定数字 (36) 的墙宽,我的程序和 Haskell 程序给出相同的结果。对于任何 36 个单位宽或更宽的墙,我的结果要低得多。我怀疑我的解决方案是否正确,因为另一张海报在这里有很多“代表”。我认为问题在于我的位矩阵中 1 的数量比应有的少得多。
#include <vector>
#include <iostream>
#include <algorithm>
const int NARROW_W = 6; // 3
const int WIDE_W = 9; // 4.5
const int MIN_WALL_W = 6; // 3
const int MAX_WALL_W = 96; // 48
const int MIN_WALL_H = 1;
const int MAX_WALL_H = 10;
// precomputed factorials for finding # of combos
static const long long fact[] =
{
1,
1,
2,
6,
24,
120,
720,
5040,
40320,
362880,
3628800,
39916800,
479001600,
6227020800
};
using namespace std;
typedef vector<unsigned long long> LongVec;
typedef vector< vector<int> > IntMat;
LongVec operator * (const IntMat &a, const LongVec &b); // O(n^2)
int main(int argc, char** argv)
{
int i, j, k;
int width, height;
int lcm; // Lowest Common Multiple
int narrowc, widec;
bool valid;
unsigned rowc;
IntMat bit_mat, gap_vecs, block_vecs;
vector<int> gaps, blocks;
vector<int>::iterator it;
unsigned long long result;
LongVec vec_res;
if (argc < 3)
{
cerr << "Usage: " << argv[0] << " [width] [height]\n";
exit(EXIT_FAILURE);
}
width = (int) (strtod(argv[1], NULL) * 2);
height = (int) strtod(argv[2], NULL);
if (width < MIN_WALL_W || width > MAX_WALL_W)
{
cerr << "Width out of range\n";
exit(EXIT_FAILURE);
}
if (height < MIN_WALL_H || height > MAX_WALL_H)
{
cerr << "Height out of range\n";
exit(EXIT_FAILURE);
}
// see if valid row is possible
// by removing narrows and adding wides until width is reached
narrowc = width / NARROW_W;
widec = 0;
valid = false;
if (width % NARROW_W > 0)
{
while (narrowc > 0 && !valid)
{
narrowc--;
widec = 0;
do
widec++;
while ((widec * WIDE_W) + (narrowc * NARROW_W) < width);
if ((widec * WIDE_W) + (narrowc * NARROW_W) == width)
valid = true;
}
}
else valid = true;
if (!valid)
{
cout << 0;
exit(EXIT_SUCCESS);
}
// find valid rows
lcm = WIDE_W;
while (lcm % WIDE_W != 0 || lcm % NARROW_W != 0)
lcm++;
rowc = 0;
while (narrowc >= 0)
{
rowc += (unsigned) (fact[narrowc + widec] /
(fact[narrowc] * fact[widec]));
block_vecs.reserve(rowc);
gap_vecs.reserve(rowc);
blocks.clear();
for (j = 0; j < narrowc; j++)
{
blocks.push_back(NARROW_W);
}
for (j = 0; j < widec; j++)
{
blocks.push_back(WIDE_W);
}
block_vecs.push_back(blocks);
gap_vecs.push_back(blocks);
for (j = 1; j < gap_vecs.back().size() - 1; j++)
{
gap_vecs.back().at(j) += gap_vecs.back().at(j - 1);
}
gap_vecs.back().pop_back();
if (widec > 0 && narrowc > 0)
{
while (next_permutation(blocks.begin(), blocks.end()))
{
block_vecs.push_back(blocks);
gap_vecs.push_back(blocks);
for (j = 1; j < gap_vecs.back().size() - 1; j++)
{
gap_vecs.back().at(j) += gap_vecs.back().at(j - 1);
}
gap_vecs.back().pop_back();
}
}
narrowc -= lcm / NARROW_W;
widec += lcm / WIDE_W;
}
// fill bit matrix
bit_mat.reserve(rowc);
vector<int> v(gap_vecs.at(0).size() * 2);
for (i = 0; i < rowc; i++)
{
gaps.clear();
bit_mat.push_back(gaps);
gaps = gap_vecs.at(i);
for (j = 0; j < rowc; j++)
{
//v.clear();
it = set_intersection(gaps.begin(), gaps.end(),
gap_vecs.at(j).begin(), gap_vecs.at(j).end(), v.begin());
if ((int) (it - v.begin()) != 0)
{
bit_mat.back().push_back(0);
}
else
{
bit_mat.back().push_back(1);
}
}
}
// multiply vector of 1's by bit matrix (height - 1) times
vec_res.assign(rowc, 1);
for (i = 0; i < height - 1; i++)
{
vec_res = bit_mat * vec_res;
}
result = 0;
for (i = 0; i < vec_res.size(); i++)
result += vec_res.at(i);
cout << result;
exit(EXIT_SUCCESS);
}
LongVec operator * (const IntMat &a, const LongVec &b)
{
int i, j;
int m = a.size();
int n = b.size();
LongVec result(m);
for (i = 0; i < m; i++)
{
result[i] = 0;
for (j = 0; j < n; j++)
{
result[i] += a[i][j] * b[j];
}
}
return result;
}
我怀疑,如果这没有提供正确的解决方案,则 set_intersection() 函数没有做它应该做的事情(看看两组“差距”索引之间是否有任何匹配)。有任何想法吗?我在 Mac OS X 10.8 上使用 g++ 进行编译。
最佳答案
// precomputed factorials for finding # of combos
static const long long fact[] =
{
1,
1,
2,
6,
24,
120,
720,
5040,
40320,
362880,
3628800,
39916800,
479001600,
6227020800
};
您缺少一些阶乘,在
rowc += (unsigned) (fact[narrowc + widec] /
(fact[narrowc] * fact[widec]));
您可能需要 16 个!为了你的极限。添加
,
87178291200,
1307674368000,
20922789888000
在适当的地方。
关于algorithm - 装箱解决方案 : what's going on with this?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13925685/
我正在使用 go 图表库 https://github.com/wcharczuk/go-chart制作条形图。我面临的问题是标签值很长,我想将文本旋转 45 度以显示完整文本 我喜欢显示的日期格式是
我在构建一个非常简单的通过 cgo 调用 c 代码的 go 程序时遇到了问题。我的设置: $: echo $GOPATH /go $: pwd /go/src/main $: ls ctest.c
没有 C 的背景,只有 Go 的“初学者”经验,我正在尝试弄清楚 main.go 是实际需要的还是只是一个约定。 我想创建一个简单的网络 API,但有人可以为我澄清一下吗? 最佳答案 main.go
我read从 Go 1.4 开始,Go 运行时是用 Go 本身编写的(而不是用 C)。 这怎么可能?如果 Go 程序在运行时之上运行,并且运行时是 Go 程序,那么运行时是否在自身之上运行? 最佳答案
这是“Go 之旅”中的代码示例 Range and Close : package main import ( "fmt" ) func fibonacci(n int, c chan int
给定以下 go.mod 文件: module foo go 1.12 require ( github.com/bar/baz v1.0.0 github.com/rat/cat v1
我有一个 CI/CD 管道,它需要跨平台并与几个不同的管理程序一起工作。为了不必更改 Windows 和 Linux 的构建任务,我认为 Go 将是编写一次代码并在任何地方运行的好方法。然而,考虑到
我有一个 Dockerfile,用于使用 go build 编译 Go 应用程序。我进行了研究,确实建议将 go build 用于生产。 但是我找不到正确的答案来解释为什么。 我了解 go run 创
我尝试在命令提示符#Go lang 中运行该程序-但是当我键入运行“go run hello.go”命令时,我开始了 CreateFile hello.go:The system cannot fin
我正在使用“Go 编程语言”一书学习 Go。第一章介绍os.Open用于读取文件的模块。我尝试打开如下所示的 go 文件。 f, err = os.Open("helloworld.go") 我收
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题?通过 editing this post 添加详细信息并澄清问题. 2年前关闭。 Improve this
为了解决我对 goroutine 的一些误解,我去了 Go 操场跑了 this code : package main import ( "fmt" ) func other(done cha
这个问题在这里已经有了答案: Evaluate/Execute Golang code/expressions like js' eval() (5 个回答) 1年前关闭。 对于任何 go 程序,我想
这是我基本上试图从路径打印基准的代码。 这意味着,如果用户输入“/some/random/path.java”,则输出将为“path”。同样,如果用户arg为“/another/myapp.c”,则输
$ go version 1.13.3 我的文件夹结构如下: GOPATH +---src +--- my-api-server +--- my-auth-server
这个问题在这里已经有了答案: How to embed file for later parsing execution use (4 个答案) What's the best way to bun
我觉得这有点奇怪,为什么这段代码不起作用? package main import "fmt" func main() { var i, j int = 1, 2 k
go编译器执行完如下命令后的可执行文件存放在哪里? $> go run file.go 最佳答案 在 /tmp 文件夹中,如果您使用的是 unix 机器。 如果您使用的是 Windows,则在 \Us
我目前正在开始使用 Go,并且已经深入研究了有关包命名和工作区文件夹结构的注意事项。 不过,我不太确定如何根据 Go 范式正确组织我的代码。 这是我当前的结构示例,它位于 $GOPATH/src 中:
假设我有一个接受用户输入的 Lua 程序,而该输入恰好是有效的 Lua 源代码。这是在程序仍在运行时进行清理、编译和执行的。 Go 是否(或将)实现这样的事情? 最佳答案 我认为以下两个项目之间有足够
我是一名优秀的程序员,十分优秀!